纪念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 }

 

posted @ 2021-03-02 17:20  acmloser  阅读(63)  评论(0编辑  收藏  举报