UVA12470—Tribonacci (类似斐波那契,简单题)

题目链接:https://vjudge.net/problem/UVA-12470

题目意思:我们都知道斐波那契数列F[i]=F[i-1]+F[i-2],现在我们要算这样的一个式子T[i]=T[i-1]+T[i-2]+T[i-3]的第n想是多少,很套路的矩阵快速幂,入门题,算是熟悉矩阵快速幂的操作吧。

代码:

 1 //Author: xiaowuga
 2 #include<bits/stdc++.h>
 3 #define maxx INT_MAX
 4 #define minn INT_MIN
 5 #define inf 0x3f3f3f3f
 6 #define N  3
 7 using namespace std;
 8 const int MOD=1000000009;
 9 typedef long long ll;
10 ll  n,size=3;//第n项,矩阵大小
11 struct Matrix{
12     ll mat[N][N];
13     void clear(){
14         memset(mat,0,sizeof(mat));
15     }
16     Matrix operator * (const Matrix & m) const{
17         Matrix tmp;
18         int i ,j,k;
19         tmp.clear();
20         for( i=0;i<size;i++)
21             for( k=0;k<size;k++){
22                 if(mat[i][k]==0) continue;
23                 for( j=0;j<size;j++){
24                     tmp.mat[i][j]+=mat[i][k]*m.mat[k][j];
25                     tmp.mat[i][j]%=MOD;
26                 }
27             }
28         return tmp;
29     }
30 };
31 Matrix POW(Matrix m,ll k){
32     Matrix ans;
33     memset(ans.mat,0,sizeof(ans.mat));
34     for(int i=0;i<size;i++) ans.mat[i][i]=1;
35     while(k){
36         if(k&1) ans=ans*m;
37         k=k>>1;
38         m=m*m;
39     }
40     return ans;
41 }
42 int main() {
43     Matrix m;
44     m.clear();
45     m.mat[0][0]=m.mat[0][1]=m.mat[0][2]=1;
46     m.mat[1][0]=1;m.mat[2][1]=1;
47     ll f[3]={2,1,0};
48     while(cin>>n&&n){
49         if(n<=3) {cout<<n-1<<endl; continue;}
50         Matrix ans=POW(m,n-3);
51         ll sum=0;
52         for(int i=0;i<3;i++){
53            sum+=ans.mat[0][i]*f[i]%MOD;
54            sum%=MOD; 
55         }
56         cout<<sum<<endl;
57     }
58     return 0;
59 }
View Code

 

posted on 2017-08-14 10:44  xiaowuga  阅读(426)  评论(0编辑  收藏  举报

导航