矩阵构造没啥说的
a c
0 1
主要是用到了快速积来解决 (p*q)%m 可能会爆long long的问题 这样就不用高精度了 但仅限于有取模运算时
快速积就是把快速幂的乘换成加即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll m,a,c,x0,n,g;
ll getmul(ll a,ll b)
{
ll ans;
ans=0;
while(b>0)
{
if(b%2==1)
{
ans=(ans+a)%m;
}
a=(a+a)%m;
b/=2;
}
return ans;
}
void getmatmul(ll a[][3],ll b[][3],ll c[][3])
{
ll t[3][3];
int i,j,k;
for(i=1;i<=2;i++)
{
for(j=1;j<=2;j++)
{
t[i][j]=0;
for(k=1;k<=2;k++)
{
t[i][j]+=getmul(a[i][k],b[k][j]);
t[i][j]%=m;
}
}
}
memcpy(c,t,sizeof(t));
return;
}
ll getmatpow()
{
ll mat[3][3],ans[3][3];
mat[1][1]=a,mat[1][2]=c;
mat[2][1]=0,mat[2][2]=1;
ans[1][1]=1,ans[1][2]=0;
ans[2][1]=0,ans[2][2]=1;
while(n>0)
{
if(n%2==1)
{
getmatmul(ans,mat,ans);
}
getmatmul(mat,mat,mat);
n/=2;
}
return (((getmul(ans[1][1],x0%m))%m+ans[1][2])%m)%g;
}
int main()
{
while(scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g)!=EOF)
{
printf("%lld\n",getmatpow());
}
return 0;
}