1. 程式人生 > >第十場 hdu 6172 Array Challenge(矩陣快速冪)

第十場 hdu 6172 Array Challenge(矩陣快速冪)

不知道 log tar 4.6 width += arr open ret

http://acm.hdu.edu.cn/showproblem.php?pid=6172

題目大意:按照給出的公式算出an

解題思路:an=4an-1+17an-2-12an-3,不要問我為什麽,我也不知道(?_?)

AC代碼:

技術分享
 1 #include <iostream>
 2 #include<bits/stdc++.h>
 3 //if(~i)//當i不是-1時滿足條件
 4 using namespace std;
 5 const int SMod=1e9+7;
 6 struct Matrix
 7 {
 8     long long m[4][4];
9 }; 10 Matrix Mul(Matrix a,Matrix b) 11 { 12 Matrix c; 13 memset(c.m,0,sizeof(c.m)); 14 for(int i=0;i<4;i++) 15 for(int j=0;j<4;j++) 16 for(int k=0;k<4;k++) 17 c.m[i][j]+=((a.m[i][k]*b.m[k][j])%SMod+SMod)%SMod; 18 return c; 19 } 20 21 Matrix fastm(Matrix a,long
long n) 22 { 23 Matrix res; 24 memset(res.m,0,sizeof(res.m)); 25 for(int i=0;i<4;i++) 26 res.m[i][i]=1; 27 while(n) 28 { 29 if(n&1) 30 res=Mul(res,a); 31 n>>=1; 32 a=Mul(a,a); 33 } 34 return res; 35 } 36 int main() 37 { 38 Matrix a,ans;
39 memset(a.m,0,sizeof(a.m)); 40 a.m[0][0]=4,a.m[0][1]=17,a.m[0][2]=-12; 41 a.m[1][0]=1,a.m[2][1]=1; 42 long long t,n; 43 scanf("%lld",&t); 44 while(t--) 45 { 46 scanf("%lld",&n); 47 if(n==2) printf("31\n"); 48 else if(n==3) printf("197\n"); 49 else if(n==4) printf("1255\n"); 50 else 51 { 52 ans=fastm(a,n-4); 53 printf("%lld\n",(ans.m[0][0]*1255%SMod+SMod+ans.m[0][1]*197%SMod+SMod+ans.m[0][2]*31%SMod+SMod)%SMod); 54 } 55 } 56 return 0; 57 }
View Code

]????

第十場 hdu 6172 Array Challenge(矩陣快速冪)