利用快速幂的思想 根据矩阵的结合律 可以递归二分求解
struct Mat
{
int mat[N][N];
};
int n;
Mat operator * (Mat a,Mat b)
{
Mat c;
memset(c.mat,0,sizeof(c.mat));
int i,j,k;
for(k =0 ; k < n ; k++)
{
for(i = 0 ; i < n ;i++)
{
if(a.mat[i][k]==0) continue;//优化
for(j = 0 ;j < n ;j++)
{
if(b.mat[k][j]==0) continue;//优化
c.mat[i][j] = (c.mat[i][j]+(a.mat[i][k]*b.mat[k][j])%mod)%mod;
}
}
}
return c;
}
Mat operator ^(Mat a,int k)
{
Mat c;
int i,j;
for(i =0 ; i < n ;i++)
for(j = 0; j < n ;j++)
c.mat[i][j] = (i==j);
for(; k ;k >>= 1)
{
if(k&1) c = c*a;
a = a*a;
}
return c;
}