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;    }

原创粉丝点击