为了做 [CTS2019] 随机立方体 以及其它容斥数论难题而打的一些基础题
一身冷汗…好像有时候忘了这个 binom…
P3214 [HNOI2011] 卡农
https://www.luogu.com.cn/problem/P3214
题意:
有 \(n\) 种球,第 \(i\) 种球编号是 \(i\),且每种球都有无限个。现在你有 \(m\) 个篮子。往每个篮子里装球,满足:
- 一个篮子里不能有两个相同编号的球。
- 不能有两个篮子的东西完全相同。
- 不能有篮子是空集。
- 每种球都在偶数个篮子中出现。
篮子间互不区分,求装篮子的方案数。
\(1\le n,m\le 10 ^6\)。
题解:
题解。
哈哈,我真是越来越期待明天的 dP 专题了!
P3270 [JLOI2016]成绩比较
https://www.luogu.com.cn/problem/P3270
设比 B 神碾压的人为 nt。
直接 \(C(k)\) 为至少 \(k\) 个 nt 的方案数。
设 B 神的成绩分别为 \(b_1,b_2...b_m\)。
则对于第 \(i\) 科目:
nt 的分数方案就是 \(b_i^k\)。
其他人的方案:\(\binom {n-k}{R_i-1}(U_i-b_i)^{R_i-1}\)。
合并起来:
即使是把中间的 binom 提到和号外面,其它两项也是难算的。
注意到 \(b^k\) 可以用自然数幂和解决。
最后的那个括号呢? 试试二项式定理:
\((a+b)^n=\sum\limits_{i\in[0,n]} \binom{i}{n}a^ib^{n-i}\)
然后用两次自然数幂和就行了吧。。?有空了插插看
met:自然数幂和是可以拉插 n^2 的!
P4448 [AHOI2018初中组]球球的排列
https://www.luogu.com.cn/problem/P4448
有一个显然的容斥:
\(C(i)\) 为至少有 \(i\) 个冲突的方案数。接下来就是求这个东西了。
首先,如果 \(a\) 和 \(b\) 冲突,\(b\) 和 \(c\) 冲突,则 \(a\) 和 \(c\) 冲突。自己推推可得。
所以如果冲突的点间连边,那么就会形成很多个团(完全图)。我们只着眼于一个团,而把其它数字都当作隔板(也就是说,只关注这个团每个点是否相邻,而不管其它团的其它点)。
设 \(g_{i,j}\) 为大小为 \(i\) 的团,在中间插板,有至少 \(j\) 个冲突的方案数。
那么,则会有 \(i-j\) 个块,\(i-j-1\) 和板子。
第一项是所有元素区分。第二项是选空隙插板。第三项是块间不区分(因为我们把块黏在一起,当作一个元素,后面如果一共有 x 个元素,就直接乘以 x 即可)。
然后就可以通过背包算出方案。
背包:
\(f_{i,j}\) 选了前 \(i\) 个团,得到至少 \(j\) 对冲突的方案数。
最后就是容斥回去了。记得 \(C(i)=f_{tot,j}*(n-j)!\)。\(tot\) 是团总数,\((n-j)\) 是因为有 \(j\) 个冲突的数组有 \(n-j\) 个元素,所以就是乘上排列数。
P5400 [CTS2019] 随机立方体
https://www.luogu.com.cn/problem/P5400
不行,还是没有头绪,看来我得再做基础题。
CF990G GCD Counting
https://www.luogu.com.cn/problem/CF990G
见到 gcd 想到莫比乌斯反演
- \([\gcd(x,y)=1]=\sum\limits_{d|\gcd(x,y)}\mu(d)\)。
- 若 \(f(n)=\sum\limits_{d|n}g(d)\) 则 \(g(n)=\sum\limits_{d|n}f(n/d)\mu(d)\)。
- 若 \(f(n)=\sum\limits_{n|d}g(d)\) 则 \(g(n)=\sum\limits_{n|d}f(d)\mu(d/n)\)。
设 \(f_x\) 为当前有多少链的 gcd=x,\(g_x\) 为当前多少链的 gcd|x。
那么 \(g_x=\sum\limits_{x|d} f_d\) 根据莫反 2 可得 \(f_x=\sum\limits_{x|d} g_{d}\mu(d/x)\)。
当然,还有一种求 \(f_x\) 的方法,用容斥:
然后倒叙枚举 \(f\) 即可。
所以任务是计算 \(g_x\)。对于所有的 \(x\),只保留两边点权都是 \(x\) 的倍数的边。那么 \(g_x\) 就是【保留后的图】的链的个数。因为每个点只有 \(O(\sqrt a_i)\) 的因数,所以总的是 \(O(n\sqrt a)\) 的。
这题好像还可以点分治,,,懒得想了
met:见到 gcd 想莫反。
*AGC028D Chords
https://www.luogu.com.cn/problem/AT4438
-
为什么只用枚举 \(l\le r\) 的 \([l,r]\)?不是一个环吗。
答:强行定向,避免重复计算。而且如果时逆向的,会以枚举到“连通块中最能包含的点”统计。比如 6 个点: 1-5 2-6 3-4 那么不会再 \([2,5]\) 统计,而是在 \([1,6]\) 统计。
-
为什么只用枚举 \(l,r\) 连通块的方案?不用管这个连通块的大小,或者 \([l,r]\) 里面的连通块有多少个吗?
答:连通块无论大小多少,贡献都是 1。\([l,r]\) 里面的连通块 \([l',r']\) 会在枚举到 \([l',r']\) 时候计算到的。
于是设 \(f_{l,r}\) 代表如果 \(l,r\) 这两个点在一个连通块里,\([l,r]\) 会有多少方案。
再设 \(g_x\) 为 \(x\) 个点,如果没有任何给定边,的方案数。obv 是双阶乘,\(x\) 为偶数时 \(g_x=(x-1)!!\)(可以这样想,一开始一个点有 \((x-1)\) 种连边方法,第二个点有 \((x-3)\) 选法…),\(x\) 为奇数时 =0。
那么需要保证:\(l,r\) 之间的自由点是偶数。没有一个给定的边,一个在 \([l,r]\) 内,一个在 \([l,r]\) 外。设 \(l,r\) 之间的自由点个数为 \(c(l,r)\)
然后容斥一下, 就是减去 \(l\) 与其它的 \(r\) 连边的值。
然后就有 \(f_{l,r}=g_{c(l,r)}-\sum\limits_{x\in(l,r)}f_{l,x}*g_{c(x+1,r)}\)。
答案就是 \(\sum f_{l,r}g_{n-2K-c(l,r)}\)。
met:注意每个点的枚举顺序。比如这里的环,可以强制为链,保证不会重复枚举。也就是,对于每个要枚举的元素,找到一种顺序使得他只会被枚举一次。
CF917D Stranger Trees
https://www.luogu.com.cn/problem/CF917D
不显然可以用矩阵树定理。(为什么这东西总是在我渐忘时,突然出现
想想有没有非机械化的做法。
如果有 \(n\) 个点形成 \(m\) 个连通块,第 \(i\) 个连通块大小是 \(a_i\),那么用 \(n-1\) 条边将其联通的方案数是 \(n^{m-2}\prod a_i\)。—— CF156D。
考虑容斥,于是求 \(g_x\) 为至少 \(x\) 条边重叠的情况。
有 \(x\) 条边重叠,也就是有 \(n-x\) 个连通块,我们需要计算出 \(\sum\limits_{\{a\}}\prod a_i\)。这个东西虽然非常眼熟,但是现在用一个 dp 解决也是可以的:
设 \(f_{u,i,j}\) 为 \(u\) 点的子树,有 \(i\) 个连通块。自己所在的连通块大小为 \(j\),的 \(\sum\prod\)。(还未乘上自己连通块的大小)
\(O(n^3)\)。
还有一种 \(O(n^2)\) 的 dp 方法:
你发现这个背包是形如 \(f_b*b\) 的转移形式的,那就考虑每个连通块的贡献是 siz。
于是直接设 \(f_{u,i,j}\) 为 \(u\) 点的子树,有 \(i\) 个连通块。自己所在的连通块是否有被计算即可,具体看看题解。
met:统计 \(\sum\limits_{\{a\}}\) 这类东西的时候,用树背包。
P3349 [ZJOI2016]小星星
https://www.luogu.com.cn/problem/P3349
因为是树,所以树形 dp。又因为 \(n\le 17\),所以状压 dp。
\(f_{u,i,S}\) 为 \(u\) 点编号是 \(i\),而且 \(i\) 字数内编号集合为 \(S\) ,的方案数。因为编号是排列。防止重复。obv
直接做,一看就至少是 \(O(2^{n^2})\) 之类的东西,非常不可做。所以试图把 \(S\) 维度压掉。
于是直接容斥。枚举一个子集 \(S\) 代表点集。这样就不要求一定要每个元素只选一次了。随便做做即可,做完了。
那么答案就是 \(\sum\limits_S (-1)^{|S|}calc(S)\)。
met:并不要一开始就用容斥。容斥可以只用于优化 dP。