总之
就是用矩阵
来个快速幂加速一下
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define LL long long
#define MOD 1000000007
using namespace std;
struct nico
{
LL p[5][5];
}d,ans,yumi;
LL p,q,a1,a2,n,m;
nico operator * (nico a,nico b)
{
int i,j,k;
nico c;
memset(c.p,0,sizeof(c.p));
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
for(k=1;k<=2;k++)
c.p[i][j]+=(a.p[i][k]*b.p[k][j])%m;
return c;
}
nico fastpow(nico pika,LL x)
{
while(x!=1)
{
if(x%2==1) yumi=yumi*pika;
x=x>>1;
pika=pika*pika;
}
return yumi*pika;
}
int main()
{
int i;
scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&m);
if(n==1)
{
printf("%lld",a1%m);
return 0;
}
if(n==2)
{
printf("%lld",a2%m);
return 0;
}
for(i=1;i<=2;i++)
yumi.p[i][i]=1;
d.p[1][1]=p;
d.p[2][1]=q;
d.p[1][2]=1;
d.p[2][2]=0;
nico mid=fastpow(d,n-2);
ans.p[1][1]=a2;
ans.p[1][2]=a1;
LL kkk=ans.p[1][1]*mid.p[1][1]+ans.p[1][2]*mid.p[2][1];
printf("%lld",kkk%m);
return 0;
}