}
#include
#include
#include
#define LL long long
using namespace std;
struct mat{
LL at[16][16];
};
mat dat;
int n,mod;
void dfs(int l,int now,int pre)
{
if(l>4)return;
if(l==4)
{
++dat.at[pre][now];
return;
}
dfs(l+1,(now<<1)|1,(pre<<1));
dfs(l+1,(now<<1),(pre<<1)|1);
dfs(l+2,(now<<2)|3,(pre<<2)|3);
}
mat mul(mat a,mat b)
{
mat c;
memset(c.at,0,sizeof(c.at));
for(int i=0;i<16;++i)
{
for(int k=0;k<16;++k)
{
if(a.at[i][k])
{
for(int j=0;j<16;++j)
{
c.at[i][j]+=a.at[i][k]*b.at[k][j];
}
}
}
}
return c;
}
mat expo(mat a,int k)
{
if(k==1)return a;
mat e;
memset(e.at,0,sizeof(e.at));
for(int i=0;i<16;++i){e.at[i][i]=1;}
if(k==0)return e;
while(k)
{
if(k&1)e=mul(a,e);
a=mul(a,a);
k>>=1;
}
return e;
}
int main()
{
memset(dat.at,0,sizeof(dat.at));
dfs(0,0,0);
while(~scanf("%d%d",&n,&mod))
{
if(!n&&!mod)break;
if(mod==1){printf("0\n");continue;}
mat ans=expo(dat,n);
printf("%lld\n",ans.at[15][15]);
}
return 0;
}