纪念SlingShot FZU - 1683
考察:矩阵快速幂
思路:
构造1X4的矩阵{f[n],f[n-1],f[n-2],S[n]},根据给出的递推公式很容易构造出a矩阵.注意数据有n = 1和n = 0的情况,需要特判.
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 typedef long long LL; 6 const int N = 5,Mod = 2009; 7 int a[N][N],f[N]; 8 void mul(int f[],int a[][N]) 9 { 10 int res[N]; 11 memset(res,0,sizeof res); 12 for(int i=0;i<4;i++) 13 for(int j=0;j<4;j++) 14 res[i] = (res[i]+(LL)f[j]*a[j][i])%Mod; 15 memcpy(f,res,sizeof res); 16 } 17 void mulself(int a[][N]) 18 { 19 int res[N][N]; 20 memset(res,0,sizeof res); 21 for(int i=0;i<4;i++) 22 for(int j=0;j<4;j++) 23 for(int k=0;k<4;k++) 24 res[i][j] = (res[i][j]+(LL)a[i][k]*a[k][j])%Mod; 25 memcpy(a,res,sizeof res); 26 } 27 int main() 28 { 29 int T,kcase = 0; 30 scanf("%d",&T); 31 while(T--) 32 { 33 int n; 34 scanf("%d",&n); 35 if(!n) {printf("Case %d: %d\n",++kcase,1);continue;} 36 if(n==1) {printf("Case %d: %d\n",++kcase,4);continue;} 37 memset(a,0,sizeof a); 38 a[0][0] = 3,a[1][0] = 2,a[2][0] = 7; 39 a[0][1] = 1,a[1][2] = 1,a[0][3] = 3; 40 a[1][3] = 2,a[2][3] = 7,a[3][3] = 1; 41 f[0] = 5,f[1] = 3,f[2] = 1,f[3] = 9; 42 n-=2; 43 while(n) 44 { 45 if(n&1) mul(f,a); 46 mulself(a); 47 n>>=1; 48 } 49 printf("Case %d: %d\n",++kcase,f[3]); 50 } 51 return 0; 52 }