const int maxn = 22; //矩阵大小
struct Matrix {
int r, c; //矩阵大小
int a[maxn][maxn];
//初始化
Matrix(int r,int c):r(r), c(c) {}
void reset() {memset(a,0,sizeof(a));}
//重写(),方便存取
int& operator() (int i,int j) {return a[i][j];}
//O(N^3) 矩阵乘法
Matrix operator*(const Matrix&B) {
Matrix M(r,B.c); M.reset();
for(int i=0;i<r;i++) {
for(int j=0;j<B.c;j++) {
for(int k=0;k<c;k++) {
M.a[i][j]=(M.a[i][j]+a[i][k]*B.a[k][j])%mod;
}
}
}
return M;
}
Matrix operator^(int n) {
Matrix M(r,c); M.reset();
for(int i=0;i<r;i++) M(i,i)=1;
Matrix A=*this;
for(;n;n>>=1,A=A*A) if(n&1) M=A*M;
return M;
}
void out() {
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
}
};