rt,30pts
#include <cstdio>
using namespace std;
typedef long long ll;
ll p, q, a1, a2, n, MOD;
struct Maxtic
{
ll a[3][3];
}x;
inline void memset(Maxtic &h, ll aa, ll bb, ll cc, ll dd)
{
h.a[1][1] = aa;
h.a[1][2] = bb;
h.a[2][1] = cc;
h.a[2][2] = dd;
}
inline void print(Maxtic h)
{
printf("%lld %lld\n%lld %lld\n", h.a[1][1], h.a[1][2], h.a[2][1], h.a[2][2]);
}
Maxtic operator * (Maxtic m, Maxtic n)
{
Maxtic c;
c.a[1][1] = c.a[1][2] = c.a[2][1] = c.a[2][2] = 0;
for(int i=1; i<=2; i++)
{
for(int j=1; j<=2; j++)
{
for(int t=1; t<=2; t++)
{
c.a[i][j] = (c.a[i][j] + m.a[i][t] * n.a[t][j] % MOD) % MOD;
}
}
}
return c;
}
Maxtic doi1, doi2;
Maxtic Maxtimes(ll now)
{
if(now == 1) return doi1;
Maxtic t = Maxtimes(now / 2);
t = t * t;
if(now%2 == 1) t = t * doi1;
return t;
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld", &p, &q, &a1, &a2, &n, &MOD);
MOD = 1e9 + 7; // 此话省略
memset(doi1, p, 1, q, 0);
memset(doi2, a1, a2, 0, 0);
if(n == 1)
{
printf("%lld", a1);
return 0;
}
if(n == 2)
{
printf("%lld", a2);
return 0;
}
Maxtic x = Maxtimes(n-2);
printf("%lld\n", (x*doi2).a[1][1]);
}
hack数据:
in:
5 8 0 15 100 47
out:
2