矩阵快速幂
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int Nmax = 25; 5 const int INF =1e9; 6 const int mod=1000000007; 7 8 long long n; 9 int error; 10 struct Matrix 11 { 12 int n,m; 13 long long map[Nmax][Nmax]; 14 Matrix(int x,int y) 15 { 16 n=x;m=y; 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=m;j++) 19 map[i][j]=0; 20 } 21 Matrix operator * (const Matrix b) 22 { 23 Matrix c(n,b.m); 24 if(m==b.n) 25 { 26 for(int i=1;i<=c.n;i++) 27 for(int j=1;j<=c.m;j++) 28 for(int k=1;k<=m;k++) 29 c.map[i][j]=(c.map[i][j]+(map[i][k]*b.map[k][j])%mod)%mod; 30 return c; 31 } 32 printf("error!!!!!!!!!!!!!! "); 33 } 34 }; 35 36 Matrix get(long long n) 37 { 38 Matrix base(2,2); 39 base.map[1][1]=2; 40 base.map[1][2]=2; 41 base.map[2][1]=1; 42 base.map[2][2]=0; 43 Matrix ans(2,2); 44 ans.map[1][1]=1; 45 ans.map[1][2]=0; 46 ans.map[2][1]=0; 47 ans.map[2][2]=1; 48 49 while(n>0) 50 { 51 if(n & 1) 52 ans=ans*base; 53 base=base*base; 54 n>>=1; 55 } 56 57 return ans; 58 } 59 60 61 62 int main() 63 { 64 //freopen("bjfu.in","r",stdin); 65 Matrix base(2,1); 66 base.map[1][1]=8; 67 base.map[2][1]=3; 68 69 while(scanf("%I64d",&n)==1) 70 { 71 if(n>=3) 72 { 73 Matrix ans=get(n-2); 74 ans=ans*base; 75 printf("%I64d ",ans.map[1][1]); 76 } 77 else 78 { 79 printf("%I64d ",base.map[3-n][1]); 80 } 81 } 82 return 0; 83 }