矩阵运算模板
struct info{ int n,m,A[N][N]; info(int a,int b):n(a),m(b){memset(A,0,sizeof(A));} int *operator [](int x){return A[x];} friend info operator *(info a,info b){ info c(a.n,b.m); for(int i=0;i<c.n;++i) for(int j=0;j<c.m;++j) for(int k=0;k<a.m;++k) c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j]%mo)%mo; return c; } void print(){ for(int i=0;i<n;++i,puts("")) for(int j=0;j<m;++j) printf("%d ",A[i][j]); puts(""); } }; info Pow(info A,int c){ info res(A.n,A.m); for(int i=0;i<res.n;++i) res[i][i]=1; for(;c;c>>=1,A=A*A) if(c&1) res=res*A; return res; }