const ll MOD=1e9+7;
const int MAXN=60; //矩阵阶数
struct Matrix{
ll m[MAXN][MAXN];
Matrix()
{
memset(m,0,sizeof(m));
for(int i=0;i<MAXN;i++)
m[i][i]=1;
}
void clear(){
memset(m,0,sizeof(m));
}
void show(){
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXN;j++)
cout<<m[i][j]<<" ";
cout<<endl;
}
}
};
Matrix mtMul(Matrix A,Matrix B)
{
int i,j,k,tmp;
Matrix C;
C.clear();
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
for(int k=0;k<MAXN;k++)
C.m[i][j]=(C.m[i][j]%MOD+(A.m[i][k]%MOD)*(B.m[k][j]%MOD))%MOD;
return C;
}
Matrix mtPow(Matrix A,int k)
{
k--;
Matrix ans=A;
while(k){
if(k&1) ans=mtMul(ans,A);
A=mtMul(A,A);
k>>=1;
}
return ans;
}