為了慶祝 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 取模)。注意乙個人可以不吃任何壽司。
用時:2h,1ac
這題對我這種蒟蒻來說還是太難了.下面來分析:
首先看到互質容易想到要質因數分解,然後根據常識,會自然的想到 \(\sqrt\) ,猛地意識到只有22,也就是說小於 \(\sqrt\) 的質因子個數只有8個,可以狀壓表示在dp狀態裡面,對於不合法直接判掉即可.
難點在於大於\(\sqrt\)的部分,我並不會.
我們知道大於\(\sqrt\)的質因子只會出現一次,這個要很好的利用,所以我們依據 \(>\sqrt\) 的質因子分類,質因子相同的歸為一類,即按質因子大小排序,順序處理,然後這樣就可以保證只出現在乙個人手上了,我們設 \(g[2][i][j]\) 表示當前的質因子集合在小g和小w手上,兩個人手上小於根號\(n\)的部分狀態分別為\(i,j\) 時的方案,轉移非常簡單,處理完乙個集合之後,考慮合併到同乙個狀態方便下乙個集合的轉移,設 \(f[i][j]\) 表示合併後的狀態,含義同 \(g\) ,處理完乙個集合之後即
\(f[i][j]=g[0][i][j]+g[1][i][j]-f[i][j]\)
注意減去重複部分
#include #include #include #include #include #include using namespace std;
typedef long long ll;
const int n=505;
ll mod;int n,prime[10]=;
struct node
void work()
if(x>1)a[i].pri=x;
}f[0][0]=1;
sort(a+2,a+n+1);
for(int i=2;i<=n;i++)
}if(i==n || a[i].pri!=a[i+1].pri || a[i].pri<22)
for(int j=tot;j>=0;j--)
for(int k=tot;k>=0;k--)
}ll ans=0;
for(int i=tot;i>=0;i--)
for(int j=tot;j>=0;j--)
if((i&j)==0)add(ans,f[i][j]);
printf("%lld\n",ans);
}int main()
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...