

#include<iostream> #include<cstring> using namespace std; const int maxn=2,mod=1000000007; struct Matrix { long long mat[maxn][maxn]; Matrix operator*(const Matrix& m)const///重载*运算符,使其能进行矩阵相乘的运算 { Matrix tmp; for(int i = 0 ; i < maxn ; i++) { for(int j = 0 ; j < maxn ; j++) { tmp.mat[i][j] = 0; for(int k = 0 ; k < maxn ; k++) { tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%mod; tmp.mat[i][j] %= mod; } } } return tmp; } }; Matrix m; void init() { m.mat[0][0]=3; m.mat[0][1]=1; m.mat[1][0]=1; m.mat[1][1]=3; } long long run(long long n) { Matrix ans; memset(ans.mat,0,sizeof(ans.mat)); for(int i=0; i<2; i++) ans.mat[i][i]=1; while(n) { if(n&1) ans=ans*m; n>>=1; m=m*m; } return ans.mat[0][0]; } int main() { long long n; while(cin>>n) { init(); cout<<run(n)<<endl; } return 0; }
浙公网安备 33010602011771号