裸题,注意细节就可以了,不再赘述。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long sint;
struct matrix
{
sint a[2][2];
void cl()
{
memset(a,0,sizeof(a));
}
};
sint x0,a,c,g,m,n;
sint mul(sint X,sint Y)
{
sint re=0;
while(Y)
{
if(Y&1) re+=X,re=(re>m?re-m:re);
X+=X,X=(X>m?X-m:X);
Y>>=1;
}
return re;
}
matrix operator * (matrix aa,matrix bb)
{
matrix cc;cc.cl();
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
cc.a[i][j]+=mul(aa.a[i][k],bb.a[k][j]);
if(cc.a[i][j]>m) cc.a[i][j]-=m;
}
}
}
return cc;
}
sint quick()
{
matrix res;
res.cl();
res.a[0][0]=1;res.a[1][1]=1;
matrix x,y;x.cl();y.cl();
x.a[0][0]=x0;x.a[0][1]=c;
y.a[0][0]=a;y.a[1][0]=y.a[1][1]=1;
while(n)
{
if(n&1)
{
res=res*y;
}
y=y*y;
n>>=1;
}
x=x*res;
return x.a[0][0]%g;
}
int main()
{
//freopen("random20.in","r",stdin);
cin>>m>>a>>c>>x0>>n>>g;
a%=m;c%=m;
cout<<quick();
return 0;
}