之前补题的时候边界少处理一个,wa一发,初始矩阵打错一个数,又wa一发ORZ
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=110; const int MOD=1e9+9; #define mod(x) ((x)%MOD) int n; struct mat { int m[maxn][maxn]; }unit; mat operator * (mat a,mat b) { mat ret; ll x; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { x=0; for(int k=0;k<n;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); ret.m[i][j]=mod(x); } } return ret; } void init_unit() { for(int i=0;i<maxn;i++) unit.m[i][i]=1; return; } mat pow_mat(mat a,ll n) { mat ret=unit; while(n) { if(n&1) ret=ret*a; a=a*a; n>>=1; } return ret; } int main() { ll x; init_unit(); while(cin>>x) { if(x!=1){ mat a; n=4; a.m[0][0]=0;a.m[0][1]=0;a.m[0][2]=1;a.m[0][3]=2; a.m[1][0]=1;a.m[1][1]=0;a.m[1][2]=0;a.m[1][3]=0; a.m[2][0]=1;a.m[2][1]=3;a.m[2][2]=0;a.m[2][3]=0; a.m[3][0]=0;a.m[3][1]=0;a.m[3][2]=1;a.m[3][3]=0; a=pow_mat(a,x-2); mat b; b.m[0][0]=5; b.m[1][0]=1; b.m[2][0]=7; b.m[3][0]=1; mat c; for(int i=0;i<4;i++){ for(int j=0;j<1;j++){ ll x=0; for(int k=0;k<4;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); c.m[i][j]=mod(x); } } ll t=c.m[2][0]; a.m[0][0]=0;a.m[0][1]=0;a.m[0][2]=1;a.m[0][3]=2; a.m[1][0]=1;a.m[1][1]=0;a.m[1][2]=0;a.m[1][3]=0; a.m[2][0]=1;a.m[2][1]=3;a.m[2][2]=0;a.m[2][3]=0; a.m[3][0]=0;a.m[3][1]=0;a.m[3][2]=1;a.m[3][3]=0; if(t!=1){ a=pow_mat(a,t-2); for(int i=0;i<4;i++){ for(int j=0;j<1;j++){ ll x=0; for(int k=0;k<4;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); c.m[i][j]=mod(x); } } cout<<c.m[0][0]<<endl;} else cout<<1<<endl; } else cout<<1<<endl; } return 0; }