题意:t组,输入n,a,b;f(1)=a;f(2)=b;求f(n);f(n)=f(n-1)+2*f(n-2)+n^4;
思路:肯定是矩阵快速幂啦,(n+1)^4=n^4+4n^3+6n^2+4n+1,所以为7*7的矩阵,{1,n,n^2,n^3,n^4,f(n),f(n-1)}*A={1,(n+1)^2,(n+2)^3,(n+1)^4,f(n+1),f(n)},
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 8 using namespace std; 9 const long long mod = 2147493647; 10 struct prog 11 { 12 long long a[8][8]; 13 }; 14 prog s,B; 15 prog matrixmul(prog a,prog b) 16 { 17 prog c; 18 for(int i=1;i<8;++i)for(int j=1;j<8;++j) 19 { 20 c.a[i][j]=0; 21 for(int k=1;k<8;k++) 22 c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod; 23 c.a[i][j]%=mod; 24 } 25 return c; 26 } 27 prog mul(prog s,int k) 28 { 29 prog ans; 30 for(int i=1;i<8;++i)for(int j=1;j<8;++j) ans.a[i][j]=(i==j)?1:0; 31 while(k){ 32 if(k&1) 33 ans=matrixmul(ans,s); 34 k>>=1; 35 s=matrixmul(s,s); 36 } 37 return ans; 38 } 39 int main() 40 { 41 int n,t,a,b; 42 for(scanf("%d",&t);t--;){ 43 scanf("%d %d %d",&n,&a,&b); 44 if(n==1){printf("%lld ",a%mod);continue;} 45 if(n==2){printf("%lld ",b%mod);continue;} 46 if(n==3){printf("%lld ",(81+2*a%mod+b%mod)%mod);continue;} 47 n-=2; 48 for(int i=1;i<=7;++i)for(int j=1;j<=7;++j) s.a[i][j]=0,B.a[i][j]=0; 49 for(int i=1; i<=5; i++)s.a[i][1]=1; 50 for(int i=2; i<=5; i++)s.a[i][2]=i-1; 51 s.a[3][3]=1;s.a[4][3]=3;s.a[5][3]=6; 52 s.a[4][4]=1;s.a[5][4]=4; 53 s.a[5][5]=1;s.a[6][5]=1; 54 s.a[6][6]=1;s.a[7][6]=1; 55 s.a[6][7]=2; 56 B.a[1][1]=1;B.a[2][1]=3;B.a[3][1]=9;B.a[4][1]=27;B.a[5][1]=81;B.a[6][1]=b;B.a[7][1]=a; 57 s=mul(s,n); 58 s=matrixmul(s,B); 59 printf("%lld ",s.a[6][1]%mod); 60 } 61 return 0; 62 }
{f
f