#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=510,M=1<<9;
int primes[8]={2,3,5,7,11,13,17,19};
struct node
{
int w;
int P,B=-1;
bool operator<(const node &t)const
{
return w<t.w;
}
inline void init()
{
for(int i=0;i<8;i++)
{
while(w%primes[i]==0) P=P|(1<<i),w/=primes[i];
}
if(w>1)B=w;
}
}num[N];
int f[M][M];
int g1[M][M];
int g2[M][M];
int n,mod;
signed main()
{
scanf("%lld%lld",&n,&mod);
for(int i=1;i<n;i++) num[i].w=i+1,num[i].init();
sort(num+1,num+n);
f[0][0]=1;
int i;
for(i=1;i<n&&num[i].B==-1;i++)
{
int S=num[i].P;
for(int s1=(1<<8)-1;s1>=0;s1--)
{
int s=((1<<8)-1)^s1;
for(int s2=s;s2>=1;s2=(s2-1)&s)
{
if(!(S&s2)) f[s1|S][s2]=(f[s1|S][s2]+f[s1][s2])%mod;
if(!(S&s1)) f[s1][s2|S]=(f[s1][s2|S]+f[s1][s2])%mod;
}
int s2=0;
if(!(S&s2)) f[s1|S][s2]=(f[s1|S][s2]+f[s1][s2])%mod;
if(!(S&s1)) f[s1][s2|S]=(f[s1][s2|S]+f[s1][s2])%mod;
}
}
for(;i<n;i++)
{
if(num[i].B!=num[i-1].B) memcpy(g1,f,sizeof f),memcpy(g2,f,sizeof f);
int S=num[i].P;
for(int s1=(1<<8)-1;s1>=1;s1--)
{
int s=((1<<8)-1)^s1;
for(int s2=s;s2>=1;s2=(s2-1)&s)
{
if(!(S&s2)) g1[s1|S][s2]=(g1[s1|S][s2]+g1[s1][s2])%mod;
if(!(S&s1)) g2[s1][s2|S]=(g2[s1][s2|S]+g2[s1][s2])%mod;
}
int s2=0;
if(!(S&s2)) g1[s1|S][s2]=(g1[s1|S][s2]+g1[s1][s2])%mod;
if(!(S&s1)) g2[s1][s2|S]=(g2[s1][s2|S]+g2[s1][s2])%mod;
}
if(num[i].B!=num[i+1].B||i==n-1)
{
for(int s1=(1<<8)-1;s1>=0;s1--)
{
int s=((1<<8)-1)^s1;
for(int s2=s;s2>=1;s2=(s2-1)&s)
{
f[s1][s2]=((g1[s1][s2]+g2[s1][s2])%mod-f[s1][s2]+mod)%mod;
}
int s2=0;
f[s1][s2]=((g1[s1][s2]+g2[s1][s2])%mod-f[s1][s2]+mod)%mod;
}
}
}
int ans=0;
for(int s1=(1<<8)-1;s1>=0;s1--)
{
int s=((1<<8)-1)^s1;
for(int s2=s;s2>=1;s2=(s2-1)&s)
{
ans=(ans+f[s1][s2])%mod;
}
int s2=0;
ans=(ans+f[s1][s2])%mod;
}
printf("%lld",ans);
return 0;
}