矩阵快速幂.
要写非递归版快速乘,要不然无限爆栈囧..
AC code:
#include <cstdio>
typedef long long ll;
ll m,a,c,x0,n,g,top;
ll stk[1001];
ll A[2][2];
ll mul(ll x,ll y){
ll t=0;
top=0;
while(y){
stk[++top]=y;
y>>=1;
}
for(int i=top;i;i--){
t=(t+t)%m;
if(stk[i]&1) t=(t+x)%m;
}
return t;
}
void qpow(ll k){
if(k==1){
A[0][0]=1;A[1][0]=c%m;A[1][1]=a%m;
return ;
}
qpow(k>>1);
ll B[2][2]={0};
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
for(int l=0;l<=1;l++)
B[i][j]=(B[i][j]+mul(A[i][l],A[l][j]))%m;
if(k&1){
B[1][0]=(B[1][0]+mul(B[1][1],c))%m;
B[1][1]=mul(B[1][1],a);
}
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
A[i][j]=B[i][j];
}
int main(){
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
qpow(n);
x0=(mul(x0,A[1][1])+A[1][0])%m%g;
printf("%lld",x0);
return 0;
}