為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。
在晚宴上,主辦方為大家提供了 n−1
'>n−1n−1 種不同的壽司,編號 1,2
,3,…
,n−1
'>1,2,3,…,n−11,2,3,…,n−1 ,其中第 i
'>ii 種壽司的美味度為 i+1
'>i+1i+1 (即壽司的美味度為從 2
'>22 到 n
'>nn )。
現在小 g 和小 w 希望每人選一些壽司種類來品嚐,他們規定一種品嚐方案為不和諧的當且僅當:小 g 品嚐的壽司種類中存在一種美味度為 x
'>xx 的壽司,小 w 品嚐的壽司中存在一種美味度為 y
'>yy 的壽司,而 x
'>xx 與 y
'>yy 不互質。
現在小 g 和小 w 希望統計一共有多少種和諧的品嚐壽司的方案(對給定的正整數 p
'>pp 取模)。注意乙個人可以不吃任何壽司。
輸入檔案的第 1
'>11 行包含 2
'>22 個正整數 n,p
'>n,pn,p ,中間用單個空格隔開,表示共有 n
'>nn 種壽司,最終和諧的方案數要對 p
'>pp 取模。
輸出一行包含 1
'>11 個整數,表示所求的方案模 p
'>pp 的結果。
input
3 10000
output
input
4 10000
output
input
100 100000000
output
測試點編號
n'>n的規模約定1
2≤n≤
30'>2≤n≤30
01000000000
'>042≤n
≤100
'>2≤n≤10056
2≤n≤
200'>2≤n≤20078
2≤n≤
500'>2≤n≤500910
時間限制:1
s'>1s
空間限制:512
mb'>512mb
狀壓dp
很容易就想到只要兩個集合中沒有相同的質因數就滿足條件了
注意,每個數中》sqrt(500)的數最多只有乙個!!
於是,我們可以列舉出列dp:f[i][j][k]表示選到第i個數,a的狀態為j,b的狀態為k的方案數
然後呢?
我們對i分解質因數,並記錄最大的質數以及它的狀態
如:138=2*3*23,所以它的最大的質數為23,狀態為3(二進位制為11000000)
於是,f[i][j][k]+=f[i-1][j][k],f[i][j|s[i]][k]+=f[i-1][j][k],f[i][j][k|s[i]]+=f[i-1][j][k],
大質數的情況特判一下就好了
#include #includeusing
namespace
std;
int i,j,k,n,m,x,y,t,mod,prime[9],f[510][1
<<8][1
<<8][3
];struct datap[501
];inline
bool cmp(const data&a,const data&b)
int add(int &x,int y)
intmain()
p[i].bi=te;
}sort(p+2,p+1+n,cmp);f[1][0][0][0]=1
;
for (i=2;i<=n;i++)
for (j=0;j<(1
<<8);j++)
for (k=0;k<(1
<<8);k++)
else
if (f[i-1][j][k][1])
if (f[i-1][j][k][2])}}
}int ans=0;for (i=0;i<(1
<<8);i++)for (j=0;j<(1
<<8);j++)if ((i&j)==0)for (k=0;k<=2;k++)add(ans,f[n][i][j][k]);
printf(
"%d\n
",ans);
return0;
}
NOI 2015 壽司晚宴
description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...
NOI 2015 壽司晚宴
4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...
NOI2015 壽司晚宴
題目 這是一篇需要龜速乘的思博題解 我們考慮一下 n leq 30 的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,dp i s 1 s 2 表示前 i 個數考慮完了,第乙個人選擇的質因子狀態為 s 1 第二個人選擇的質因子狀態為 s 2 轉移的話就考...