为了做 [CTS2019] 随机立方体 以及其它容斥数论难题而打的一些基础题

\[f_x=\sum\limits_{i=x}(-1)^{i-x}\binom i xg_i \]

一身冷汗…好像有时候忘了这个 binom…

P3214 [HNOI2011] 卡农

https://www.luogu.com.cn/problem/P3214

题意:

\(n\) 种球,第 \(i\) 种球编号是 \(i\),且每种球都有无限个。现在你有 \(m\) 个篮子。往每个篮子里装球,满足:

  1. 一个篮子里不能有两个相同编号的球。
  2. 不能有两个篮子的东西完全相同。
  3. 不能有篮子是空集。
  4. 每种球都在偶数个篮子中出现。

篮子间互不区分,求装篮子的方案数。

\(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}\)

合并起来:

\[C(k)=\prod_{i\in[1,m]}\sum\limits_{b_i\in[1,U_i)}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}\)

\[\begin{align} \sum\limits_{b_i\in[1,U_i)}(U_i-b_i)^{R_i-1} &=\sum\limits_{b_i}\sum\limits_j\binom {R_i-1}j(-U_i)^{R_i-1}b_i^{R_i-1}\\ &=\sum\limits_{j}\sum\limits_{b_i}...\\ &=\sum\limits_j\binom{R_i-1}j(-U_i)^{R_i-1}\sum\limits_{b_i}b_i^{R_i-1} \end{align} \]

然后用两次自然数幂和就行了吧。。?有空了插插看

met:自然数幂和是可以拉插 n^2 的!

P4448 [AHOI2018初中组]球球的排列

https://www.luogu.com.cn/problem/P4448

有一个显然的容斥:

\[\sum\limits_{i\in[0,n-1]} (-1)^i C(i) \]

\(C(i)\) 为至少有 \(i\) 个冲突的方案数。接下来就是求这个东西了。

首先,如果 \(a\)\(b\) 冲突,\(b\)\(c\) 冲突,则 \(a\)\(c\) 冲突。自己推推可得。

所以如果冲突的点间连边,那么就会形成很多个团(完全图)。我们只着眼于一个团,而把其它数字都当作隔板(也就是说,只关注这个团每个点是否相邻,而不管其它团的其它点)。

\(g_{i,j}\) 为大小为 \(i\) 的团,在中间插板,有至少 \(j\) 个冲突的方案数。

那么,则会有 \(i-j\) 个块,\(i-j-1\) 和板子。

第一项是所有元素区分。第二项是选空隙插板。第三项是块间不区分(因为我们把块黏在一起,当作一个元素,后面如果一共有 x 个元素,就直接乘以 x 即可)。

\[g_{i,j}=i!*\binom{i-1}{i-j-1}*\frac 1 {i-j} \]

然后就可以通过背包算出方案。

背包:

\(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 想到莫比乌斯反演

  1. \([\gcd(x,y)=1]=\sum\limits_{d|\gcd(x,y)}\mu(d)\)
  2. \(f(n)=\sum\limits_{d|n}g(d)\)\(g(n)=\sum\limits_{d|n}f(n/d)\mu(d)\)
  3. \(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_x=g_x-\sum\limits_{i=2}f_{ix} \]

然后倒叙枚举 \(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

  1. 为什么只用枚举 \(l\le r\)\([l,r]\)?不是一个环吗。

    答:强行定向,避免重复计算。而且如果时逆向的,会以枚举到“连通块中最能包含的点”统计。比如 6 个点: 1-5 2-6 3-4 那么不会再 \([2,5]\) 统计,而是在 \([1,6]\) 统计。

  2. 为什么只用枚举 \(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\)。(还未乘上自己连通块的大小)

\[f_{u,i+j,a}+=f_{u,i,a}*f_{v,j,b}*b ~~\text{(no merge)}\\f_{u,i+j-1,a+b}+=f_{u,i,a}*f_{v,j,b} ~~\text{(merge)} \]

\(O(n^3)\)

还有一种 \(O(n^2)\) 的 dp 方法:

你发现这个背包是形如 \(f_b*b\) 的转移形式的,那就考虑每个连通块的贡献是 siz。

于是直接设 \(f_{u,i,j}\)\(u\) 点的子树,有 \(i\) 个连通块。自己所在的连通块是否有被计算即可,具体看看题解

\[\begin{array}{c}f_{u, x, 0} \cdot f_{v, y, 1} \rightarrow f_{u, x+y, 0}^{\prime} \\f_{u, x, 1} \cdot f_{v, y, 1} \rightarrow f_{u, x+y, 1}^{\prime} \\f_{u, x, 0} \cdot f_{v, y, 0} \rightarrow f_{u, x+y-1,0}^{\prime} \\f_{u, x, 1} \cdot f_{v, y, 0}+f_{u, x, 0} \cdot f_{v, y, 1} \rightarrow f_{u, x+y-1,1}^{\prime}\end{array} \]

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

\[f_{u,i,S|T}=f_{u,i,S}*f_{v,j,T}(如果i-j有边,而且编号不重) \]

直接做,一看就至少是 \(O(2^{n^2})\) 之类的东西,非常不可做。所以试图把 \(S\) 维度压掉。

于是直接容斥。枚举一个子集 \(S\) 代表点集。这样就不要求一定要每个元素只选一次了。随便做做即可,做完了。

那么答案就是 \(\sum\limits_S (-1)^{|S|}calc(S)\)

met:并不要一开始就用容斥。容斥可以只用于优化 dP。

posted @ 2022-07-18 16:35  BlankAo  阅读(66)  评论(0编辑  收藏  举报