#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>#include <iostream>using namespace std;#define int long long inline int gi(){ char tmp=getchar();int ans=0; while(tmp<'0' || tmp>'9') tmp=getchar(); while(tmp<='9' && tmp>='0'){ ans=ans*10+tmp-'0'; tmp=getchar(); } return ans;}const int N = 257;int Mod;int F[N][N],F1[N][N],F2[N][N];struct Num{ int maxx,state,n;}A[502];bool cmp(Num a,Num b){ return a.maxx<b.maxx;}int P[1200],cnt=-1;inline void Solve(int pos){ A[pos].n=pos; for(int i=0;i<8;++i) if(pos % P[i] == 0) A[pos].state+=(1<<i); for(int i=8;i<=cnt;++i){ if(pos % P[i]==0){ A[pos].maxx=P[i]; return; } }}bool Vis[1002];inline void Init(){ for(int i=2;i<=510;++i){ if(!Vis[i]) P[++cnt]=i; else continue; for(int j=i;j<=600;j+=i) Vis[j]=1; }}signed main(){ int n=gi();Mod=gi(); Init(); for(int i=2;i<=n;++i) Solve(i); for(int i=1;i<n;++i) A[i]=A[i+1]; sort(A+1,A+n,cmp); F[0][0]=1; for(int i=1;i<n;++i){ if(A[i].maxx==0 || A[i].maxx != A[i-1].maxx){ memcpy(F1,F,sizeof F); memcpy(F2,F,sizeof F); } for(int j=255;j>=0;--j){ for(int k=255;k>=0;--k){ if(j&k) continue; if((A[i].state&k)==0) F1[j|A[i].state][k]+=F1[j][k]; if((A[i].state&j)==0) F2[j][k|A[i].state]+=F2[j][k]; F2[j][k|A[i].state]%=Mod; F1[j|A[i].state][k]%=Mod; } } if(i==n-1 || A[i].maxx != A[i+1].maxx || A[i].maxx==0){ for(int j=255;j>=0;--j){ for(int k=255;k>=0;--k){ if(j&k) continue; F[j][k]=((F1[j][k]+F2[j][k])%Mod-F[j][k]+Mod)%Mod; } } } } int ans=0; for(int i=0;i<=255;++i) for(int j=0;j<=255;++j) if((i&j)==0) ans=(ans+F[i][j])%Mod; printf("%lld",ans); return 0;}