首页 > 代码库 > HDU - 1005 Number Sequence(简单矩阵快速幂)

HDU - 1005 Number Sequence(简单矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

就是这道题目,然而找了一晚上的错误 \("▔□▔)/\("▔□▔)/\("▔□▔)/。

 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4  5 struct matrix{ 6     int m[2][2];     7 }ans,base; 8  9 matrix multi(matrix a,matrix b){10     matrix temp;11     memset(temp.m,0,sizeof(temp.m));12     for(int i=0;i<2;i++){13         for(int j=0;j<2;j++){14             for(int k=0;k<2;k++){15                 temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%7;16             }17         }18     }    19     return temp;20 }21 22 int fast_mod(int a,int b,int n){23     base.m[0][0]=a;base.m[0][1]=b;base.m[1][0]=1;base.m[1][1]=0;24     ans.m[0][0]=ans.m[1][1]=1;25     ans.m[0][1]=ans.m[1][0]=0;26     while(n>0){27         if(n&1) ans=multi(ans,base);28         base=multi(base,base);29         n>>=1;30     }31     return (ans.m[0][0]+ans.m[0][1])%7;32 }33 34 int main(){35     int a,b,n;36     while(cin>>a>>b>>n){37         if(a==0&&b==0&&n==0) break;38         if(n==1||n==2) cout<<1<<endl;39         else cout<<fast_mod(a,b,n-2)<<endl;40     }41     return 0;42 }

 

HDU - 1005 Number Sequence(简单矩阵快速幂)