#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define LL long long int mod; int a[4][4]={ { 1, 1, 1, 1}, { 1, 1, 0, 0}, {-1, 0,-1, 0}, {-1, 0, 0, 0} }; struct matrix{ int f[4][4]; }; matrix mul(matrix a,matrix b) { matrix c; memset(c.f,0,sizeof(c.f)); int i,j,k; for(k=0;k<4;k++) { for(i=0;i<4;i++) { if(!a.f[i][k])continue; for(j=0;j<4;j++) { if(!b.f[k][j])continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod; } } } return c; } matrix pow_mod(matrix a,int b) { matrix s; int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) s.f[i][j]=(i==j?1:0); while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s; } int main() { int n; while(cin>>n>>mod) { if(n==0) { cout<<0<<endl; continue; } matrix e; int i,j; memcpy(e.f,a,sizeof(a)); /*for(i=0;i<4;i++) { for(j=0;j<4;j++) cout<<e.f[i][j]<<" "; cout<<endl; }*/ e=pow_mod(e,n-1); int ans=0; ans=(e.f[0][0]+e.f[1][0]+e.f[0][1]+e.f[1][1])%mod; cout<<(ans+mod)%mod<<endl;//ans会出现负的 } return 0; } /* 矩阵状态,f[i][j]表示长度为i的以j结尾不是O-queue的方案数(j=f,m,ff,fm) f m ff fm f | 1 1 1 1| m | 1 1 0 0| ff |-1 0 -1 0| fm |-1 0 0 0| f[i][f]=f[i-1][f]+f[i-1][m]-f[i-1][ff]-f[i-1][fm],要减去以ff和fm结尾的,因为不能出现fff,fmf */