
//f(n)=f(n-1)+f(n-3)+f(n-4)
//找出了递推公式,相应的矩阵也好构造了,
//f(n) 1 0 1 1 f(n-1)
//f(n-1) =1 0 0 0 * f(n-2)
//f(n-2) 0 1 0 0 f(n-3)
//f(n-3) 0 0 0 1 f(n-4)
//接着便是二分法求矩阵的幂了
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<queue>
#include<algorithm>
using namespace std;
const int matsize=4;
struct mat {
int a[matsize][matsize];
};
mat in;
int i,j;
mat A,ans;
int m,l;
int f[matsize]= {6,4,2,1};
void init() {
int i,j;
for(i=0; i<matsize; i++)
for(j=0; j<matsize; j++)
if(i==j)
in.a[i][j]=1;
else in.a[i][j]=0;
A.a[0][0]=1;A.a[0][1]=0;A.a[0][2]=1;A.a[0][3]=1;
A.a[1][0]=1;A.a[1][1]=0;A.a[1][2]=0;A.a[1][3]=0;
A.a[2][0]=0;A.a[2][1]=1;A.a[2][2]=0;A.a[2][3]=0;
A.a[3][0]=0;A.a[3][1]=0;A.a[3][2]=1;A.a[3][3]=0;
}
mat mul(mat x,mat y) {
int i,k,j;
mat temp;
for(i=0; i<matsize; i++)
for(k=0; k<matsize; k++) {
temp.a[i][k]=0;
for(j=0; j<matsize; j++)
temp.a[i][k]+=(x.a[i][j]*y.a[j][k])%m;
temp.a[i][k]%=m;
}
return temp;
}
mat qmod(mat x,int k) {
mat temp=x,ans=in;//ans要初始化为主对角线为1,其余为0的矩阵
while(k>0) {
if(k&1)
ans=mul(ans,temp);
temp=mul(temp,temp);
k=k>>1;
}
return ans;
}
int main() {
while(~scanf("%d%d",&l,&m)) {
init();
if(l<matsize) {
printf("%d\n",f[matsize-l-1]%m);
continue;
}
ans=qmod(A,l-3);
int n=0;
for(i=0; i<matsize; i++) {
n+=(ans.a[0][i]*f[i])%m;
n%=m;
}
printf("%d\n",n);
}
return 0;
}