快速计算递推式
struct Matrix
{
int F[10][10];
};
inline Matrix Mul(Matrix A,Matrix B)
{
Matrix C;
int i,j,k;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
C.F[i][j]=0;
for(k=1;k<=4;k++)
{
C.F[i][j]+=(A.F[i][k]*B.F[k][j])%MOD;
C.F[i][j]%=MOD;
}
}
return C;
}
inline Matrix POW(Matrix A,int n)
{
Matrix ret,temp;temp=A;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
ret.F[i][j]=0;
for(int i=1;i<=4;i++)
ret.F[i][i]=1;
while(n)
{
if(n&1) ret=Mul(ret,temp);
temp=Mul(temp,temp);
n>>=1;
}
return ret;
}