BZOJ4197 NOI2015 壽司晚宴

2022-04-28 20:18:08 字數 1115 閱讀 3540

bzoj

luogu

從\(2\)到\(n\)中選出兩個不相交子集使得這兩個集合中的任一對元素互質。問總方案數模\(mod\)的結果。\(n\le500\)。

首先有\(30\%\)的部分分是\(n\le30\),考慮到\(30\)以內的質因數只有\(10\)個,因此可以狀壓\(dp\),即設\(f[s_1][s_2]\)表示第乙個人選出的質因數集合為\(s_1\),第二個人選出的質因數集合為\(s_2\)的方案數。複雜度\(o(n2^)\)。

對於\(100\%\)的資料\(n\le500\)。首先可以發現乙個這樣的性質:每個數中含有至多乙個大於等於\(23\)的質因數,那麼也就是說大於等於\(23\)的質因數是不可能產生衝突的。所以我們就只需要考慮前\(8\)個字元,然後對於每乙個大於等於\(23\)的質因數,列舉是哪個人選擇這個質因數,然後對應的轉移就行了。

對於不含大於等於\(23\)的質因數的數,可以當做它含有乙個其他數都不含有的質因數,然後按照上述的方式轉移,可以避免一些討論。

複雜度是\(o(n2^)\)。

#include#include#includeusing namespace std;

#define pi pair#define mk make_pair

#define fi first

#define se second

const int n = 505;

int p=;

int n,mod,f[n][n],g[2][n][n],ans;

pi a[n];

void add(int &x,int y)

int main()

sort(a+2,a+n+1);f[0][0]=g[0][0][0]=g[1][0][0]=1;

for (int t=2;t<=n;++t)

if (a[t].fi==1||a[t].fi!=a[t+1].fi)

} for (int i=0;i<256;++i)

for (int j=0;j<256;++j)

if ((i&j)==0) add(ans,f[i][j]);

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

return 0;

}

BZOJ 4197 Noi2015 壽司晚宴

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

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 壽司晚宴

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