#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;
}