hdu 4291(矩阵幂)
来源:互联网 发布:番禺网络推广公司电话 编辑:程序博客网 时间:2024/05/21 13:22
/*找到循环节*/#include <stdio.h>int main(){ long long a,b,c,i; a=0; b=1; for(i=1;;i++) { c=(a+3*b)%222222224; c=c%222222224; a=b%222222224; b=c%222222224; if(a==0 && b==1) { printf("%d\n",i); break; } } // for(;;);}#include <stdio.h>#define N 2struct matrix{ long long m[2][2];}A,B; void init(){ A.m[0][0]=1, A.m[0][1]=0; A.m[1][0]=0, A.m[1][1]=1; B.m[0][0]=3, B.m[0][1]=1; B.m[1][0]=1, B.m[1][1]=0;}matrix matrixmul(matrix a,matrix b,long long mod){ matrix c; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { c.m[i][j]=0; for(int k=0;k<N;k++) c.m[i][j] += (a.m[i][k]*b.m[k][j])%mod; c.m[i][j]%=mod; } return c; }long long qiuckpow(long long n,long long mod){ matrix m=B,b=A; if(n==0) return 0; n--; while(n>=1) { if(n&1) b = matrixmul(b,m,mod); n = (n>>1); m = matrixmul(m,m,mod); } return b.m[0][0]; }int main(){ long long n; long long ans; init(); while(scanf("%I64d",&n)!=EOF) { ans = qiuckpow(n,183120); ans = qiuckpow(ans,222222224); ans = qiuckpow(ans,1000000007); printf("%I64d\n",ans); } return 0; }