NOI2015 壽司晚宴 狀壓DP

2021-09-07 11:00:31 字數 1435 閱讀 9995

為了慶祝 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題解:能夠發現,選了乙個數等於是選了它的質因子。首先n僅僅有500,所以小於根號500的質因子僅僅有8個。

我們能夠把這8個質因子壓成二進位制位。形成2^8個集合。

對於每乙個數。僅僅可能含有不超過1個大於根號500的質因子,我們按這個將每乙個數分類。

把每乙個數存到乙個結構體s裡,s.kind表示這個數里大於根號500的質因子是什麼。沒有的話為1。s.se表示這個數小於根號500的質因子的包括情況,用二進位制位壓一下。

然後我們按kind排序。dp就可以。

dp的時候把kind同樣的放在一起dp。

設f[i][j]表示第乙個人選了i這個質因數集合,第二個人選了j這個質因數集合的方案數。

對於每一類數開始dp時。

先把f陣列複製兩遍到p[1]和p[2];

p[i][j][k]表示當前是第i個人進行操作。第1個人選的集合是j第二個人是k的方案數。

用p陣列進行更新。

dp結束後要用p陣列更新f陣列。f=p1+p2-f; 由於兩個p陣列中都包括了選當前數的情況,然而這顯然是不能夠的,所以要減去之前的f。

#include#include#include#includeusing namespace std;

int f[301][301],p[3][301][301],pp,ans;

int prime[8]=,n;

struct uses[600];

bool cmp(use a,use b)

if (i==n||s[i].kind==1||s[i].kind!=s[i+1].kind)

} ans=0;

for (int i=0;i<=255;i++)

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

if ((i&j)==0) ans=(ans+f[i][j])%pp;

cout<}

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 轉移的話就考...