记录编号 407081 评测结果 AAAAAAAAAA
题目名称 [NOI 2015]寿司晚宴 最终得分 100
用户昵称 Gravatar泪寒之雪 是否通过 通过
代码语言 C++ 运行时间 1.588 s
提交时间 2017-05-20 11:56:06 内存使用 1.07 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int g[10]={0,2,3,5,7,11,13,17,19};
int  b,n,q,f[256][256],i,aaa,j,k,p[2][256][256];
long long ans;
char c;
struct Node{
	int ppp,ansss; 
}aa[503],top;
inline Node getaans(int x){
	aaa=0;
	for (j=8;j>=1;j--)
	 {
	 	aaa<<=1;
	 	if (x%g[j]==0) aaa++;
		while (x%g[j]==0) x=x/g[j];	 	
	 }
	 top.ansss=x;
	 top.ppp=aaa;
	 return top;
}
inline void read (int &x){
	b=1;c=getchar();
	for (;!('0'<=c && c<='9');c=getchar()) if (c=='-') b=-1;
	for (x=0;('0'<=c && c<='9');) {
		x=x*10+c-'0';
	    c=getchar();
	} 
	x=x*b;
}
inline void read (long long &x){
	b=1;c=getchar();
	for (;!('0'<=c && c<='9');c=getchar()) if (c=='-') b=-1;
	for (x=0;('0'<=c && c<='9');) {
		x=x*10+c-'0';
	    c=getchar();
	} 
	x=x*b;
}
inline int cmp(Node a ,Node b){
	return a.ansss<b.ansss;
}
int main () {
   freopen("dinner.in","r",stdin);
   freopen("dinner.out","w",stdout);
   read(n); read(q);
   for (i=2;i<=n;i++)
     aa[i]=getaans(i);
    sort(aa+2,aa+n+1,cmp);
    f[0][0]=1; p[0][0][0]=1; p[1][0][0]=1;
   for 	(i=2;i<=n;i++)
    {
      if (aa[i].ansss==1||aa[i].ansss!=aa[i-1].ansss)
       {
         	memcpy(p[0],f,sizeof f);
         	memcpy(p[1],f,sizeof f);
	   }
    	for (j=255;j>=0;j--)
    	 for (k=255;k>=0;k--)
         {
    	  	if (!((j | aa[i].ppp) & k)) p[0][j | aa[i].ppp][k]+=p[0][j][k]; p[0][j | aa[i].ppp][k]%=q;
    	 	if (!(j & (k | aa[i].ppp))) p[1][j][k | aa[i].ppp]+=p[1][j][k]; p[1][j][k | aa[i].ppp]%=q;	
		  }
	  if (i==n||aa[i].ansss==1||aa[i].ansss!=aa[i+1].ansss)  
         {  
            for (j=0;j<=255;j++)  
              for (k=0;k<=255;k++)  
                f[j][k]=((p[1][j][k]+p[0][j][k]-f[j][k])%q+q)%q;  
         }  	
	}
   ans=0;
   for (j=0;j<=255;j++)
    	 for (k=0;k<=255;k++)
    	   if ((k & j)==0) ans+=f[j][k];
    ans=ans%q;
    printf("%lld",ans);
}