[NOI2015]寿司晚宴(状压dp)
為了慶祝NOI的成功開幕,主辦方為大家準(zhǔn)備了一場壽司晚宴。小G和小W作為參加NOI的選手,也被邀請參加了壽司晚宴。
在晚宴上,主辦方為大家提供了n?1種不同的壽司,編號(hào)1,2,3,?,n-1,其中第種壽司的美味度為i+1(即壽司的美味度為從2到n)。
現(xiàn)在小G和小W希望每人選一些壽司種類來品嘗,他們規(guī)定一種品嘗方案為不和諧的當(dāng)且僅當(dāng):小G品嘗的壽司種類中存在一種美味度為x的壽司,小W品嘗的壽司中存在一種美味度為y的壽司,而x與y不互質(zhì)。
現(xiàn)在小G和小W希望統(tǒng)計(jì)一共有多少種和諧的品嘗壽司的方案(對給定的正整數(shù)p取模)。注意一個(gè)人可以不吃任何壽司。
Solution
題意:有1-n-1這些數(shù),把他們分給兩個(gè)人(可以不分),使得從兩個(gè)人各自任意拿出一個(gè)數(shù),它們都是互質(zhì)的。
注意到n是500,范圍內(nèi)小質(zhì)數(shù)較少,可以考慮狀壓小質(zhì)數(shù)。
但是大質(zhì)數(shù)怎么處理?
我們可以設(shè)計(jì)狀態(tài)為dp[i][j]表示做到了第i個(gè)大質(zhì)數(shù),當(dāng)前小質(zhì)數(shù)的選擇情況為j時(shí)的方案數(shù)。
因?yàn)槊總€(gè)大質(zhì)數(shù)只能給一個(gè)人,所以我們dp的階段就是每個(gè)大質(zhì)數(shù)。
最后統(tǒng)計(jì)答案時(shí)要注意,我們把都沒選的情況考慮了兩次,把多余的部分減去就可以了。
Code
#include<iostream> #include<cstdio> #include<algorithm> #define N 509 #define R register using namespace std; int prime[N],mdiv[N],n,k,size,ma; long long g[2][1<<9][1<<9],f[1<<9][1<<9],mod,ans; struct aaa {int a,b; }ji[N]; bool cmp(aaa a,aaa b) {return a.b<b.b; } int main() {scanf("%d%lld",&n,&mod);for(R int i=2;i<=n;++i){if(!mdiv[i])mdiv[i]=i,prime[++prime[0]]=i;for(R int j=1;j<=prime[0]&&((k=prime[j]*i)<=n);++j){mdiv[k]=prime[j];if(i%prime[j]==0)break;}}size=min(prime[0],9);for(R int i=2;i<=n;++i){int tmp=i;for(R int j=1;j<=size;++j)if(!(tmp%prime[j])){while(!(tmp%prime[j]))tmp/=prime[j];ji[i].a|=(1<<j-1);}ji[i].b=tmp;}sort(ji+2,ji+n+1,cmp);ma=(1<<size)-1;f[0][0]=1; for(R int i=2;i<=n;++i){if((ji[i].b==1)||(ji[i].b!=ji[i-1].b)){for(R int j=0;j<=ma;++j)for(R int k=0;k<=ma;++k)g[0][j][k]=g[1][j][k]=f[j][k];}for(R int j=ma;j>=0;--j)for(R int k=ma;k>=0;--k)if(!(j&k)){if(!(ji[i].a&j))(g[0][j][k|ji[i].a]+=g[0][j][k])%=mod;if(!(ji[i].a&k))(g[1][j|ji[i].a][k]+=g[1][j][k])%=mod;}if((ji[i].b==1)||(ji[i].b!=ji[i+1].b))for(R int j=0;j<=ma;++j)for(R int k=0;k<=ma;++k)if(!(j&k))f[j][k]=(g[0][j][k]+g[1][j][k]-f[j][k]+mod)%mod;}for(R int i=0;i<=ma;++i)for(R int j=0;j<=ma;++j)if(!(i&j))(ans+=f[i][j])%=mod;cout<<ans;return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/ZH-comld/p/9698442.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的[NOI2015]寿司晚宴(状压dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux开机启动详细流程图
- 下一篇: rabbitmq延迟队列相关