MnZn实在是调不动了,求dalao帮忙,悬赏关注

P2150 [NOI2015] 寿司晚宴

```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


|