矩阵快速幂 F[n]=F[n-2]*2+F[n-1]+i^4

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<math.h>
 4 #include<string.h>
 5 using namespace std;
 6 typedef long long ll;
 7 const ll mod=2147493647;
 8 struct node
 9 {
10     ll a[10][10];
11 }ans,A,B;
12 node mat(node x,node y)
13 {
14     node c;
15     for(int i=0;i<=6;i++)
16     for(int j=0;j<=6;j++)
17         c.a[i][j]=0;
18     for(int i=0;i<=6;i++)
19         for(int j=0;j<=6;j++)
20         for(int k=0;k<=6;k++)
21             c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
22     return c;
23 }
24 void init()
25 {
26     A.a[0][0]=1,A.a[0][1]=2,A.a[0][2]=1,A.a[0][3]=0,A.a[0][4]=0,A.a[0][5]=0,A.a[0][6]=0;
27     A.a[1][0]=1;A.a[1][1]=0,A.a[1][2]=0,A.a[1][3]=0,A.a[1][4]=0,A.a[1][5]=0,A.a[1][6]=0;
28     A.a[2][0]=0,A.a[2][1]=0;A.a[2][2]=1;A.a[2][3]=4;A.a[2][4]=6;A.a[2][5]=4;A.a[2][6]=1;
29     A.a[3][0]=0,A.a[3][1]=0,A.a[3][2]=0,A.a[3][3]=1;A.a[3][4]=3;A.a[3][5]=3;A.a[3][6]=1;
30     A.a[4][0]=0,A.a[4][1]=0,A.a[4][2]=0,A.a[4][3]=0,A.a[4][4]=1,A.a[4][5]=2;A.a[4][6]=1;
31     A.a[5][0]=0,A.a[5][1]=0,A.a[5][2]=0,A.a[5][3]=0,A.a[5][4]=0,A.a[5][5]=1;A.a[5][6]=1;
32     A.a[6][0]=0,A.a[6][1]=0,A.a[6][2]=0,A.a[6][3]=0,A.a[6][4]=0,A.a[6][5]=0;A.a[6][6]=1;
33 }
34 void quick_mod(ll n)
35 {
36     memset(ans.a,0,sizeof(ans.a));
37     for(int i=0;i<=6;i++)
38     for(int j=0;j<=6;j++)
39         if(i==j) B.a[i][j]=1;
40         else B.a[i][j]=0;
41     init();
42     while(n){
43         if(n&1) B=mat(B,A);
44         A=mat(A,A);
45         n>>=1;
46     }
47 }
48 int main()
49 {
50     int T;
51     scanf("%d",&T);
52     while(T--){
53         ll n,aa,bb;
54         scanf("%lld%lld%lld",&n,&aa,&bb);
55         if(n==1) printf("%lld\n",aa);
56         else if(n==2) printf("%lld\n",bb);
57         else{
58             n--;
59             quick_mod(n);
60             ans.a[0][0]=bb%mod;///f(i-1)
61             ans.a[1][0]=aa%mod;
62             ans.a[2][0]=81;
63             ans.a[3][0]=27;
64             ans.a[4][0]=9;
65             ans.a[5][0]=3;
66             ans.a[6][0]=1;
67             ans=mat(B,ans);
68             printf("%lld\n",ans.a[1][0]);
69         }
70     }
71     return 0;
72 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/11499130.html