//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=555;
struct Node{int a,p;}node[N];
bool operator<(Node a,Node b){return a.p<b.p;}
char pr[]={2,3,5,7,11,13,17,19};
int n,p,f[N][N],dp[N][N][2],ans;
void div(int x){
    int cpy=x;
    for(int i=0;i<8;i++)
        if(!(x%pr[i])){
            while(x%pr[i]==0)x/=pr[i];
            node[cpy].a|=1<<i;
        }
    node[cpy].p=x;
}
int main(){
    scanf("%d%d",&n,&p);
    for(int i=2;i<=n;i++)div(i);
    sort(node+2,node+1+n),f[0][0]=1;
    for(int i=2;i<=n;i++){
        if(node[i].p==1||node[i].p!=node[i-1].p)
            for(int j=0;j<256;j++)
                for(int k=0;k<256;k++)
                    dp[j][k][0]=dp[j][k][1]=f[j][k];
        for(int j=255;~j;j--)
            for(int k=255;~k;k--){
                if(!(node[i].a&k))(dp[j|node[i].a][k][0]+=dp[j][k][0])%=p;
                if(!(node[i].a&j))(dp[j][k|node[i].a][1]+=dp[j][k][1])%=p;
            }
        if(node[i].p==1||node[i].p!=node[i+1].p)
            for(int j=255;~j;j--)
                for(int k=255;~k;k--)
                    f[j][k]=((dp[j][k][0]+dp[j][k][1]-f[j][k])%p+p)%p;
    }
    for(int i=0;i<256;i++)for(int j=0;j<256;j++)if(!(i&j))(ans+=f[i][j])%=p;
    printf("%d\n",ans);
}

 

相关文章:

  • 2021-07-17
  • 2021-08-22
  • 2021-07-15
  • 2021-09-13
  • 2021-07-03
  • 2021-08-10
  • 2021-10-29
  • 2021-11-08
猜你喜欢
  • 2021-10-09
  • 2021-12-31
  • 2021-12-30
  • 2021-11-17
  • 2021-11-04
  • 2021-06-28
  • 2022-02-10
相关资源
相似解决方案