codevs 1281 Xn数列 (矩阵乘法)
/* 再来个题练练手 scanf longlong 有bug....... */ #include<cstdio> #include<iostream> #include<cstring> #define ll long long using namespace std; ll n,m,x,y,x0,g; ll f[3][3],a[3][3]; ll slow_mul(ll a,ll b,ll c) { ll ans=0; a=a%c;b=b%c; while(b) { if(b&1) { b--; ans+=a; ans%=c; } a<<=1;a%=c;b>>=1; } return ans; } void mul(ll a[3][3],ll b[3][3]) { ll c[3][3]; memset(c,0,sizeof(c)); for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) for(int k=1;k<=2;k++) c[i][j]=(c[i][j]+slow_mul(a[i][k],b[k][j],m))%m; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) a[i][j]=c[i][j]; } int main() { cin>>m>>x>>y>>x0>>n>>g; //scanf("%ld%ld%ld%ld%ld%ld",&m,&x,&y,&x0,&n,&g); f[1][1]=x0;f[1][2]=1;a[1][1]=x;a[1][2]=0;a[2][1]=y;a[2][2]=1; while(n) { if(n&1)mul(f,a); mul(a,a); n>>=1; } printf("%ld\n",f[1][1]%g); return 0; }