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

   这道题的难点就是构造出这个矩阵

 假如是这样的一个式子 F[n]=F[n-2]*2+F[n-1],那就很简单

 但是,多了个i^4,这就很难办了。

 所以,我们要着重处理的就是这一部分  

 那么 (n+1)^4 = n^4 + 4n^3 + 6n^2 + 4n + 1

1             ans.a[0][0]=bb%mod;///f(i-1)
2             ans.a[1][0]=aa%mod;
3             ans.a[2][0]=81;
4             ans.a[3][0]=27;
5             ans.a[4][0]=9;
6             ans.a[5][0]=3;
7             ans.a[6][0]=1;                

假如目前我们处理的基础矩阵为这个样子。

那么我们就需要以下这样一个与他相乘的矩阵

1 2 1 0 0 0 0      f(2)

1 0 0 0 0 0 0   f(1)

0 0 1 4 6 4 1      81

0 0 0 1 3 3 1      27

0 0 0 0 1 2 1   9

0 0 0 0 0 1 1      3

0 0 0 0 0 0 1      1

代码如下:

 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             quick_mod(n-2);
59             ans.a[0][0]=bb%mod;///f(i-1)
60             ans.a[1][0]=aa%mod;
61             ans.a[2][0]=81;
62             ans.a[3][0]=27;
63             ans.a[4][0]=9;
64             ans.a[5][0]=3;
65             ans.a[6][0]=1;
66             ans=mat(B,ans);
67             printf("%lld\n",ans.a[0][0]);
68         }
69     }
70     return 0;
71 }
View Code

 

posted @ 2019-09-10 18:38  古比  阅读(242)  评论(0编辑  收藏  举报