class Mat{
public:
int ma[55][55]; int size;
Mat(){ memset(ma, 0, sizeof ma);} Mat(int _size):size(_size){ memset(ma, 0, sizeof ma);}
void init(){
}
void unit(){
for(int i=0;i<n;++i)
ma[i][i]=1;
}
void clear(){
memset(ma,0,sizeof ma);
}
void print(){
for(int i=0;i<size;++i){
for(int j=0;j<size;++j){
printf("%d%c",ma[i][j],j==size-1?'\n':' ');
}
}
}
};
Mat add(Mat &a,Mat &b)
{
Mat res;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
res.ma[i][j] =(a.ma[i][j] + b.ma[i][j])%m;
return res;
}
Mat multi(Mat &a,Mat &b){
Mat res(n);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<n; k++)
res.ma[i][j] =(res.ma[i][j]+a.ma[i][k] * b.ma[k][j]%mod)%mod;
}
}
return res;
}
Mat power(Mat a,int b){
Mat res(n);
res.unit();
while(b)
{
if(b & 1)
ans = multi(ans,a);
a = multi(a,a);
b >>= 1;
}
return res;
}