【题解】
矩阵乘法,但有陷阱:两个长整形相乘会溢出
因此它们相乘时用类似“快速幂”的“快速乘”解决(a*b=a*(b/2)*2 )
【代码】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef long long LL;
LL m;
struct juzhen
{
LL s[3][3];
juzhen()
{
memset(s,0,sizeof(s));
}
};
LL ksc(LL a,LL b)
{
LL ans=0,count=a;
for(;b>0;b/=2)
{
if(b&1) ans=(ans+count)%m;
count=(count*2)%m;
}
return ans;
}
juzhen cheng(juzhen a,juzhen b)
{
juzhen res;
int i,j,k;
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
{
for(k=1;k<=2;k++)
res.s[i][j]+=ksc(a.s[i][k],b.s[k][j]);
res.s[i][j]%=m;
}
return res;
}
juzhen ksm(juzhen a,LL n)
{
juzhen res;
if(n==1) return a;
res=ksm(a,n/2);
res=cheng(res,res);
if(n%2==1) res=cheng(res,a);
return res;
}
int main()
{
juzhen Z,A;
LL a,c,x0,n,g;
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
A.s[1][1]=a;
A.s[2][1]=c;
A.s[2][2]=1;
Z.s[1][1]=x0;
Z.s[1][2]=1;
A=ksm(A,n);
Z=cheng(Z,A);
printf("%lld",Z.s[1][1]%g);
return 0;
}