BZOJ 4197 Noi2015 壽司晚宴

2021-07-29 22:33:18 字數 1553 閱讀 2028

為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。

在晚宴上,主辦方為大家提供了 n−1 種不同的壽司,編號 1,2,3,…,n−1,其中第 i 種壽司的美味度為 i+1 (即壽司的美味度為從 2 到 n)。

現在小 g 和小 w 希望每人選一些壽司種類來品嚐,他們規定一種品嚐方案為不和諧的當且僅當:小 g 品嚐的壽司種類中存在一種美味度為 x 的壽司,小 w 品嚐的壽司中存在一種美味度為 y 的壽司,而 x 與 y 不互質。

現在小 g 和小 w 希望統計一共有多少種和諧的品嚐壽司的方案(對給定的正整數 p 取模)。注意乙個人可以不吃任何壽司。

輸入檔案的第 1 行包含 2 個正整數 n,p,中間用單個空格隔開,表示共有 n 種壽司,最終和諧的方案數要對 p 取模。

輸出一行包含 1 個整數,表示所求的方案模 p 的結果。

3 10000

92≤n≤500

0這題也是很服氣的。

題目大意:有[2,n]個數,現在把它們分成兩組,使得任意兩組中各乙個數互質。

如果n較小,可以考慮暴力dp。

將質因數分成兩組,交集為空。

將是否選選了某個質因數進行狀態壓縮。

設f[i][j]表示甲的質因子是i,乙的是j,則可以轉化為01揹包。

如果n較大,可以看出對於每乙個數n,大於根號n的質因數最多乙個(廢話)。

哈哈哈(緩解一下尷尬)。

如果將具有相同大質因數的數字歸為一組,對於這一組,轉移與小質數相似。

設g[0][j][k],g[1][j][k]分別表示大質數在甲和乙。

則合併時f[j][k]=g[0][j][k]+g[1][j][k]-f[j][k]因為不選的情況在兩者中都出現了,所以減去一次。

最後陣列一定不要開得太大,會浪費時間。

另:匍匐在蹂躪此題的大爺腳下,不由自主的吶喊:「。。。」

#include#include#include#includeusing namespace std;

const int n=505;

int n,pri[11]=;

long long p,ans,f[305][305],g[2][305][305];

struct node

a[n];

bool cmp(node c,node d)

if(i==n||a[i].y==1||a[i+1].y!=a[i].y)

for(int j=end;j>=0;j--)

for(int k=end;k>=0;k--)

if((j&k)==0)

f[j][k]=(g[0][j][k]+g[1][j][k]-f[j][k])%p;

} for(int j=0;j<=end;j++)

for(int k=0;k<=end;k++)

if((j&k)==0)

ans+=f[j][k],ans%=p;

ans+=p,ans%=p;

printf("%lld\n",ans);

return 0;

}

bzoj4197 NOI2015 壽司晚宴

題意 有n 1 個數從 2 n 從中選出兩個集合 s 和 u 可以為 要求對於 x s,y u,都有gc d x,y 1 求方案總數 n 500 解法 狀壓dp 首先看到互質這一條件,可以想到利用質因子來判斷 很同意證明,對於乙個數 x 大於x 的質因子至多有乙個。假設存在兩個及兩個以上大於x 的質...

BZOJ4197 NOI2015 壽司晚宴

bzoj luogu 從 2 到 n 中選出兩個不相交子集使得這兩個集合中的任一對元素互質。問總方案數模 mod 的結果。n le500 首先有 30 的部分分是 n le30 考慮到 30 以內的質因數只有 10 個,因此可以狀壓 dp 即設 f s 1 s 2 表示第乙個人選出的質因數集合為 s...

BZOJ4197 Noi2015 壽司晚宴

為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n 現在小 g 和小 w ...