```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int maxN=1000;
int n,p;
int f[300][300],f1[300][300],f2[300][300];
struct node{
int st,mx;
}a[maxN];
int pr[8]={2,3,5,7,11,13,17,19};//小质数应该这么处理
void prepare(){
for(int i=1;i<n;++i){
int c=i+1;
for(int j=0;j<8;++j){
if(c%pr[j]==0){
a[i].st|=(1<<j);
while(c%pr[j]==0) c/=pr[j];
}
}
a[i].mx = c;
}
}
bool operator < (node x,node y) {
return x.mx >y.mx ;
}
inline int add(int x,int y){
long long q=x+y;
if(q>=p) q-=p;
return (int) q;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> p;
prepare();
sort(a+1,a+n);
f[0][0]=1;
for(int i=1;i<n;++i){
if(i==1||a[i].mx !=a[i-1].mx||a[i].mx ==1){
memcpy(f1,f,sizeof(f));
memcpy(f2,f,sizeof(f));
}
for(int k=255;k>=0;--k){
for(int j=255;j>=0;--j){
if(j&k) continue ;
if((k&a[i].st)==0)
f1[j|a[i].st][k]=add(f1[j|a[i].st][k],f1[j][k]);
if((j&a[i].st)==0)
f2[j][k|a[i].st]=add(f2[j][k|a[i].st],f2[j][k]);
}
}
if(i==n-1||a[i].mx!=a[i+1].mx||a[i].mx==1){ //这里是 a[i].mx!=a[i+1].mx 而不是 a[i].mx!=a[i-1].mx
for(int k=255;k>=0;--k){
for(int j=255;j>=0;--j){
if((j&k)==0){
f[j][k]=add(add(f1[j][k],f2[j][k]),p-f[j][k]);
}
}
}
}
}
int ans=0;
for(int i=0;i<=255;++i){
for(int j=0;j<=255;++j){
if((i&j)==0) {
ans=add(ans,f[i][j]);
}
}
}
cout << ans << endl;
return 0;
}
```
@[Benzenesir](/user/258178) ,改的地方在注释中标注出来了
by ListenSnow @ 2023-03-20 10:19:05