HDU - 1005 Number Sequence(简单矩阵快速幂)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(简单矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章