矩阵快速幂 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 }