第十场 hdu 6172 Array Challenge(矩阵快速幂)
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 }
]−−−√⌋