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(简单矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1005 Number Sequence(数论)

HDU 1005 Number Sequence

HDU 1005 Number Sequence 数学

HDU 1005 Number Sequence

HDU(1005)Number Sequence

Hdu 1005 Number Sequence