//快速幂
ll quickMod(ll a,ll b,ll mod){
ll ans=1;
while(b){
if(b&1){
ans=(ans*a)%mod;
}
a=(a*a)%mod;
b>>=1;
}
return ans;
}
//矩阵快速幂
struct Matrix{
int matrix[maxn][maxn];
Matrix(){}
Matrix(int sign){
for(int i=1;i<=sign;i++){
for(int j=1;j<=sign;j++){
if(i==j) matrix[i][j]=1;
else matrix[i][j]=0;
}
}
}
};
Matrix add(Matrix* a,Matrix* b){
Matrix tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.matrix[i][j]=a->matrix[i][j]+b->matrix[i][j];
}
}
return tmp;
}
Matrix subtract(Matrix* a,Matrix* b){
Matrix tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.matrix[i][j]=a->matrix[i][j]-b->matrix[i][j];
}
}
return tmp;
}
Matrix multiply(Matrix* a,Matrix* b){
Matrix tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.matrix[i][j]=0;
for(int k=1;k<=n;k++){
tmp.matrix[i][j]+=a->matrix[i][k]*b->matrix[k][j];
}
}
}
return tmp;
}
Matrix quickMod(Matrix base,int b){
Matrix tmp;
Matrix ans(n);
while(b){
if(b&1){
tmp=multiply(&ans,&base);
}
ans=tmp;
tmp=multiply(&base,&base);
base=tmp;
b>>=1;
}
return ans;
}