BZOJ 4197 壽司晚宴 狀壓DP

2022-05-20 09:12:16 字數 1859 閱讀 6616

time limit: 10 sec  memory limit: 512 mb

submit: 694  solved: 440

[submit][status][discuss]

為了慶祝 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這資料範圍一眼看上去是沒什麼頭緒的,但是可以進行一些猜想

選乙個數,相當於選他的質因子,所以考慮篩一下$500$以內的質數,發現有接近$100$個,然後對於乙個數$n$,它的大於等於$\sqrt n$的質因數至多有乙個

然後$\sqrt 500$以內的質數只有$8$個,這就很好搞了,狀壓一下.

對於每個數記錄它小於$\sqrt 500$以內的質因數的情況,再額外記錄一下它大於$\sqrt 500$的質因數,這樣就可以dp了.

顯然對於大於$\sqrt 500$的質因數相同的數需要同時dp,這樣分兩次dp即可.

#include#include#include#include#includeusing namespace std;

#define maxn 510

int flag[maxn],prime[maxn],cnt;

inline void pre()

}// for (int i=1; i<=cnt; i++) printf("%d ",prime[i]); puts("");

}struct nodea[maxn];

inline bool cmp(node a,node b)

sort(a+1,a+n-1+1,cmp);

dp[0][0]=1;

int last=1;

for (int i=1; i<=n-1; last++,i++)

for (int j=0; j<(1<<8); j++)

for (int k=0; k<(1<<8); k++)

dp[j][k]=((tmp[0][j][k]+tmp[1][j][k]-dp[j][k])%p+p)%p;

}while (last=0; j--)

for (int k=(1<<8)-1; k>=0; k--)

if (a[i].p2!=a[i+1].p2) break;

}last++;

for (int j=0; j<(1<<8); j++)

for (int k=0; k<(1<<8); k++)

dp[j][k]=((tmp[0][j][k]+tmp[1][j][k]-dp[j][k])%p+p)%p;

}for (int j=0; j<(1<<8); j++)

for (int k=0; k<(1<<8); k++)

if (!(j&k)) (ans+=dp[j][k])%=p;

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

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