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;
}