求f[n]=f[n-1]+f[n-2]+f[n-3]
我们知道
f[n] f[n-1] f[n-2] f[n-1] f[n-2] f[n-3] 1 1 0
0 0 0 = 0 0 0 * 1 0 1
0 0 0 0 0 0 1 0 0
矩阵快速幂就是利用快速幂的思路,去加速转移矩阵的计算,从而给计算带来方便
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #define LL long long using namespace std; const LL mod = 1e9+7; struct M { LL a[3][3]; void init() { memset(a, 0, sizeof(a)); a[0][0]=1; a[1][1]=1; a[2][2]=1; } void init0(){ memset(a, 0, sizeof(a)); } }; M mul (M a,M b) { M ans; for (int i=0; i<3; i++) { for (int j=0; j<3; j++) { ans.a[i][j]=0; for (int k=0; k<3; k++) { ans.a[i][j]+=a.a[i][k]*b.a[k][j]; ans.a[i][j]%=mod; } } } return ans; } M qpow(M a,LL n) { M ans; ans.init(); while(n) { if (n&1)ans=mul(ans,a); a=mul(a,a); n/=2; } return ans; } void output(M a) { for(int i=0; i<3; ++i) { for(int j=0; j<3; ++j) { cout << a.a[i][j] << " "; } cout << endl; } } int main() { int n; int t; int num=0; scanf("%d",&t); while(t--) { scanf("%d",&n); num++; M a,b; a.a[0][0]=1; a.a[0][1]=1; a.a[0][2]=0; a.a[1][0]=1; a.a[1][1]=0; a.a[1][2]=1; a.a[2][0]=1; a.a[2][1]=0; a.a[2][2]=0; // output(a); M k=qpow(a,n); // output(a); // cout<<endl; printf("Case %d: ",num); printf("%lld ",k.a[0][0]); } return 0; }