#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>#define ll long longusingnamespacestd;
constint maxn=10,maxn1=20;
int f[maxn][maxn1],n,m,i,t,j,k,l,p,p1;
struct code{
ll a[maxn1][maxn1];
}a,b;
code c(code x,code y){
int i,j,k;code z;
memset(z.a,0,sizeof(z.a));
for (i=0;i<=15;i++)
for (j=0;j<=15;j++)
for (k=0;k<=15;k++)
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%m)%m;
return z;
}
code mi(int x){
if (x==1) return a;
code t=mi(x/2);
if (x%2) return c(c(t,t),a);return c(t,t);
}
int main(){
// freopen("data.in","r",stdin);while (1){
scanf("%d%d",&n,&m);
if (!n) break;
t=15;
f[1][15]=1;f[1][12]=1;f[1][0]=1;f[1][3]=1;f[1][9]=1;
for (j=0;j<=15;j++){
k=15;
for (l=0;l<=3;l++)
if ((1<<l)&j) k-=(1<<l);
if (!j) a.a[j][15]=1,a.a[j][12]=1,a.a[j][3]=1,a.a[j][0]=1,a.a[j][9]=1;
else{
a.a[j][k]=1;
for (l=0;l<=2;l++)
if (!((1<<l)&j) && !((1<<(l+1))&j)) a.a[j][k-(1<<l)-(1<<(l+1))]=1;
}
}
if (n>1){
b=mi(n-1);
memset(f[2],0,sizeof(f[2]));
for (j=0;j<=15;j++)
for (k=0;k<=15;k++)
f[2][j]=(f[2][j]+f[1][k]*b.a[k][j]%m)%m;
t=f[2][0];
}else t=f[1][0];
printf("%d\n",t);
}
}