萌新刚学OI,状压求调[悬赏一关注]

P2150 [NOI2015] 寿司晚宴

orz
by Naro_Ahgnay @ 2023-02-15 20:27:47


orz
by MSqwq @ 2023-02-15 20:28:19


○| ̄|_
by cccyyyxxx @ 2023-02-15 20:42:20


@[zengyean_bolt](/user/399674) @[MSqwq](/user/247269) 救救我
by _Catluo_ @ 2023-02-15 22:47:14


改疯了
by _Catluo_ @ 2023-02-15 22:47:32


改过了样例一 ```cpp #include <bits/stdc++.h> #define int long long using namespace std; int n,p,ans; struct node{ int x; int s; }a[505]; int z[8]={2,3,5,7,11,13,17,19}; bool cmp(node X,node Y){ return X.x<Y.x; } int f[(1<<8)+5][(1<<8)+5];//储存阶段的状态 int res[(1<<8)+5][(1<<8)+5][2];//存储大的质因数相同的一段 int now,pre=1; signed main(){ f[0][0]=1; cin>>n>>p;n--; for(int i=1;i<=n;i++)a[i].x=i+1; for(int i=1;i<=n;i++){ for(int j=7;j>=0;j--){//分解质因数 if(a[i].x%z[j]==0){ a[i].s+=(1<<j); while(a[i].x%z[j]==0)a[i].x/=z[j]; } } } sort(a+1,a+n+1,cmp);//大于22的质因数排序 for(int i=1;i<=n;i++){ if(i==1||a[i].x!=a[i-1].x||a[i].x==1){ for(int j=0;j<(1<<8);j++){ for(int k=0;k<(1<<8);k++){ if((j&k)==0){ res[j][k][0]=res[j][k][1]=f[j][k];//覆盖 } } } } for(int j=255;j>=0;j--){ for(int k=255;k>=0;k--){ if(j&k)continue; if(((j|a[i].s)&k)==0)res[j|a[i].s][k][0]=(res[j|a[i].s][k][0]+res[j][k][0])%p;//给第一个人 if((j&(k|a[i].s))==0)res[j][k|a[i].s][1]+=(res[j][k|a[i].s][1]+res[j][k][1])%p;//给第二个人 } } if(a[i].x!=a[i+1].x||i==n||a[i].x==1){ for(int j=0;j<(1<<8);j++){ for(int k=0;k<(1<<8);k++){ if((j&k)==0){ f[j][k]=(res[j][k][0]+res[j][k][1]-f[j][k]+p)%p;//记录下阶段的答案 } } } } } for(int j=0;j<(1<<8);j++) for(int k=0;k<(1<<8);k++) if((j&k)==0) ans=(ans+f[j][k])%p; cout<<ans<<endl; return 0; } ```
by _Catluo_ @ 2023-02-17 18:34:52


42行多了一个 $+$ ```cpp if((j&(k|a[i].s))==0)res[j][k|a[i].s][1]+=(res[j][k|a[i].s][1]+res[j][k][1])%p;//给第二个人 ``` 已经过了此贴完结
by _Catluo_ @ 2023-02-17 18:48:58


orz
by cxqghzj @ 2023-09-05 19:24:09


orz
by zzy_zzy @ 2023-09-13 22:24:03


|