题目链接: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 }