void multi(int a[][N],int b[][N],int n) {
memset(c,0,sizeof c);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
c[i][j]+=a[i][k]*b[k][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
a[i][j]=c[i][j];
}
int res[N][N];
void Pow(int a[][N],int n) {
memset(res,0,sizeof res);
for(int i=1; i<=n; i++) res[i][i]=1;
while(n) {
if(n&1) multi(res,a,n);
multi(a,a,n);
n>>=1;
}//
}
memset(c,0,sizeof c);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
c[i][j]+=a[i][k]*b[k][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
a[i][j]=c[i][j];
}
int res[N][N];
void Pow(int a[][N],int n) {
memset(res,0,sizeof res);
for(int i=1; i<=n; i++) res[i][i]=1;
while(n) {
if(n&1) multi(res,a,n);
multi(a,a,n);
n>>=1;
}//
}