Recursive sequence(矩陣快速冪)
阿新 • • 發佈:2018-12-13
題目大意:
f(n+1)=2*f(n-1)+f(n)+(n+1)^4
f(1)=a;f(2)=b;
求第n項。要mod
思路:裸的。。。構造矩陣
附上隊友醜陋優秀的程式碼:
#include<bits/stdc++.h> ///#define mod 2147493647 using namespace std; typedef long long ll; const ll mod=2147493647UL; struct matrix { ll m[10][10]; }; matrix mutil(matrix a,matrix b) { matrix c; memset(c.m,0,sizeof(c.m)); for(int i=1;i<=7;i++) { for(int j=1;j<=7;j++) { for(int k=1;k<=7;k++) { c.m[i][j]+=(a.m[i][k]%mod*b.m[k][j]%mod)%mod; } c.m[i][j]%=mod; } } return c; } matrix power(matrix A,ll k) { matrix ans; for(int i=1;i<=7;i++) { for(int j=1;j<=7;j++) { if(i==j) ans.m[i][j]=1; else ans.m[i][j]=0; } } while(k) { if(k&1) { ans=mutil(ans,A); k--; } k>>=1; A=mutil(A,A); } return ans; } int main() { ll n,i,j,t; ll a,b,res; scanf("%lld",&t); while(t--) { scanf("%lld%lld%lld",&n,&a,&b); if(n==1) printf("%lld\n",a); else if(n==2) printf("%lld\n",b); else { matrix A; for(i=1;i<=7;i++) { for(j=1;j<=7;j++) { A.m[i][j]=0; } } A.m[1][1]=1;A.m[1][2]=2;A.m[1][3]=1; A.m[2][1]=1; A.m[3][3]=1;A.m[3][4]=4;A.m[3][5]=6;A.m[3][6]=4;A.m[3][7]=1; A.m[4][4]=1;A.m[4][5]=3;A.m[4][6]=3;A.m[4][7]=1; A.m[5][5]=1;A.m[5][6]=2;A.m[5][7]=1; A.m[6][6]=1;A.m[6][7]=1; A.m[7][7]=1; matrix ans=power(A,n-2); res=0; res=(res+ans.m[1][1]%mod*b%mod)%mod; res=(res+ans.m[1][2]*a%mod)%mod; res=(res+ans.m[1][3]*81%mod)%mod; res=(res+ans.m[1][4]*27%mod)%mod; res=(res+ans.m[1][5]*9%mod)%mod; res=(res+ans.m[1][6]*3%mod)%mod; res=(res+ans.m[1][7]%mod)%mod; ///res=(((ans.m[1][1]%mod*b%mod)%mod+(ans.m[1][2]*a)%mod)%mod+(ans.m[1][3]*81)%mod+(ans.m[1][4]*27)%mod+(ans.m[1][5]*9)%mod+(ans.m[1][6]*3)%mod+ans.m[1][7])%mod; printf("%lld\n",res); } } }