20240813:组合计数选做
P3214 [HNOI2011] 卡农
题意:\(m\) 个集合,\(n\) 种元素,求集合间互不相同且每种元素出现偶数次的方案数。
题目等价于从 \(1 \sim 2^n - 1\) 里选出 \(m\) 个不同的数,使他们异或和为 \(0\)。
不妨对每个数标号,由于互不相同,最后除以 \(m!\) 即可。
设 \(f_i\) 表示前 \(i\) 个数异或和为 \(0\) 的合法方案数。
显然 \(a_i = \bigoplus_{j = 1}^{i - 1} a_j\),对于前 \(i - 1\) 个数的每种选法都唯一对应一个 \(a_i\),即 \(f_i \gets (2^n - 1)^{\underline{i - 1}}\)。
非法方案有两种:
-
\(a_i = 0\)。等价于 \(\bigoplus_{j = 1}^{i - 1} a_j = 0\),即 \(f_{i - 1}\)。
-
\(a_i\) 等于某个 \(a_j\ (j < i)\)。
也就是剩下的 \(i - 2\) 个人异或和为 \(0\),对应 \(f_{i - 2}\)。
枚举 \(j\) 的位置和 \(a_j\) 是哪个,乘上 \((i - 1) \times (2^n- i + 1)\) 的系数。
评黑确实不够格(好的他蓝了)。submission
P3330 [ZJOI2011] 看电影
题意:
\(n\) 个人 \(k\) 个座位,每个人初始随机被分配一个座位 \(i\),如果 \(i\) 上有人就去 \(i + 1\) 直到 \(k\),如果 \(k\) 也有人这个人只能站着。
求每个人都有座位的概率。
特判 \(n < k\) 概率为 \(0\)。
我们在 \(k\) 后面新增一个位置 \(k + 1\),并与位置 \(1\) 相连形成一个 \(k + 1\) 的环。
不给环标号,不同的方案为 \((k + 1)^{n - 1}\)。
由于 \(n < k + 1\),所以任意一种方案在环上走都能使所有人都有位置。
在最终状态里,找到一个没有人的位置当做 \(k + 1\),并由此断开,钦定方向标为 \(1 \sim k\),对应一种合法情况。
因此一种方案能生成 \(k + 1 - n\) 个不同的序列。
由于我们可以序列还原到 \(k + 1\) 的环,因此不存在不同的环生成同一序列。
答案等于
题目要求输出分数,由于 \(k\perp k + 1\),因此只需考虑 \(k\) 和 \(k + 1 - n\) 的公因数,不需要高精除。
P6620 [省选联考 2020 A 卷] 组合数问题
题意:给定 \(f(k) = a_0 + a_1k + \cdots a_mk^m\),求
其中 \(n \le 10^9, m \le \min(n, 1000)\)。
里面所有东西都能预处理,\(O(m^2)\) 直接算。
P3160 [CQOI2012] 局部极小值
题意:
\(n \times m\) 的矩阵,\(1 \sim n\times m\) 每个数恰好出现一次,\(n \le 4, m \le 7\)。
如果一个格子是他的八联通里的最小值,则称这个位置为局部最小值。
给定 \(n \times m\) 的网格,x 表示局部最小值,. 表示非局部最小值,求符合条件的矩阵数量。
局部最小值的数量很少,\(4 \times 7\) 的网格最多 \(8\) 个。
从小到大填数。
\(f(i, s)\) 表示当前在填 \(i\),局部最小值的状态为 \(s\)(有没有填过)的合法方案。
我们发现一个局部最小值没填的时候他周围都不能填。
\(i\) 填局部最小值 \(x\):\(f(i, s \cup x) \gets f(i - 1, s)\)。
\(i\) 不填局部最小值:\(f(i, s) \gets f(i - 1, s) \times \big(cnt_s - (i - 1 - \vert s\vert)\big)\)。
其中 \(cnt_s\) 表示状态为 \(s\) 时可填的非局部最小值。
单次 dp 复杂度 \(O(2^8nm)\)。
但是这样只满足了 x 的位置是局部最小值,并没有保证 . 的位置不是局部最小值。
性质 \(a_{i}\) 表示 \(i\) 这个位置是局部最小值,\(N(a_i)\) 表示满足这个条件的方案数。
上述 dp 可以求出任意 \(N(\prod a_i)\)。
令所有局部最小值的集合为 \(S\),则答案可以表示为
把后面的多项式展开成容斥形式:
合法状态很少,直接深搜枚举所有的 \(T\)。
P3270 [JLOI2016] 成绩比较
题意:\(n\) 个人 \(m\) 门课,\(i\) 被 \(j\) 碾压定义为每门分数都不超过 \(j\)。
所有人第 \(i\) 门课的成绩在 \(1 \sim U_i\) 之间。
给出其中 B 每门课的排名 \(r_i\)(分数严格大于他的人数 $ + 1$),求他恰好碾压 \(k\) 个人的情况数。
先选出 \(k\) 个人被 B 碾压,方案数为 \(\begin{pmatrix}n - 1\\k\end{pmatrix}\)。
剩下的 \(n - k - 1\) 个人都必须满足至少一门课的分数大于 B。
很容易求出至多 \(x\) 个人不被 B 碾压的方案 \(\begin{pmatrix} n - k - 1\\ x\end{pmatrix}\prod \begin{pmatrix} x\\ r_i - 1\end{pmatrix}\)。
那么恰好 \(n - k - 1\) 个人不被碾压的方案减还要减去恰好 \(0, 1, \cdots, n - k - 2\) 个人的方案。
直接递推或者容斥都能解决。
接下来要分配每个人的成绩,每门课相互独立,最后相乘即可。
枚举 B 的分数:
后面那个东西直接插出来。时间复杂度 \(O(n^2m)\)。
对于 \(n\) 次多项式 \(f(x)\),如果已知他的 \(n + 1\) 个点值 \((x_i, y_i)\),则
\[f(x) = \sum_{i = 1}^{n + 1} y_i \prod_{j \ne i} \dfrac{x - x_j}{x_i - x_j} \]\(f(x) = \sum_{i = 1}^x i^t\) 是关于 \(x\) 的 \(t + 1\) 次多项式。
取 \(x_i = i\ (i \le t + 2)\),预处理可以做到 \(O(t)\) 求值。
P7213 [JOISC2020] 最古の遺跡 3
题意:\(2n\) 个柱子,\(1 \sim n\) 种高度每个出现两次。
\(n\) 次地震,每次地震使 \(h_i \to h_i - 1\),当且仅当 \(i\) 后面有一根相同高度的柱子。
给定地震过后仅存的 \(n\) 个位置 \(A_1, A_2, \cdots, A_n\),求初始高度序列的方案数。
从后往前挨个震 \(n\) 次和上述操作是等效的。
考虑一个位置 \(i\),\(i\) 后面的高度集合一定只增不减(指集合元素)。
相同高度的柱子中位置最靠后的一定会被保留,也就是一种高度一旦出现不会消失。
由于 \(i\) 对后面的柱子没有影响,因此无论是全部震完之后 \(h_i\) 再减小还是和后面的柱子同步减小都是等效的。
任意时刻最多两个柱子高度相同,如果 \(t\) 时刻 \(h_i = h_j = h_k\),则 \(t - 1\) 时刻也存在 \(h_i = h_j = h_{k'}\),这与 \(t = 0\) 时矛盾。
不难发现在第 \(i\) 次操作后 \(1\sim n−i\) 每个数出现两次,\(n−i+1∼n\) 每个数出现一次,可以借助上条结论归纳。
也就是每次的两个 \(1\) 总有一个会变成 \(0\)。
因此震 \(n\) 次和震无数次是一样的,且 \(n\) 次过后 \(1 \sim n\) 各剩一个。
\(h_i\) 会消失,当且仅当最终序列的后缀 \(i + 1\) 里出现 \(1 \sim h_i\) 的每个元素。
定义 \(h_i\) 为当前序列的高度阈值(极大),所有 \(h \in [1, h_i]\) 都会消失,反之保留。
设 \(f_{i, j}\) 表示后缀 \(i\) 高度阈值为 \(j\) 的方案数。
设 \(c_0\) 表示后 \(i−1\) 个柱子中钦定消失的数量,\(c_1\) 为钦定存在的数量。
不妨先区分相同高度的两根柱子,最后除以 \(2^n\)。
-
\(i\) 位置钦定消失,阈值不变。
\(2j\) 种可用高度里,有 \(j\) 个分给 \(j\) 根标准柱(即被保留的 \(1 \sim j\)),还有 \(c_0\) 个已经分配,那么 \(f_{i, j} \gets (j - c_0) \times f_{i - 1, j}\)。
-
\(i\) 位置钦定保留。
\(h_i^{'}\) 表示当前柱子的最终高度。
如果 \(h_i^{'} > j + 1\),则高度阈值不变,\(f_{i, j} \gets f_{i -1, j}\),后续再考虑其真实高度。
如果 \(h_i^{'} = j + 1\),那么就需要确定前面遗留的 \(h > j + 1\) 的真实高度。
枚举新阈值 \(k\),从 \(f_{i - 1, j}\) 转移到 \(f_{i, k}\)。
确定转移系数。
选定标准柱的位置:\(\begin{pmatrix}c_1 - j\\k - j - 1\end{pmatrix}\)。
当前柱子的初始高度(最后降到 \(j + 1\)):\(k - j + 1\)(高度只能在 \([j + 1, k]\),标准柱 \([j + 2, k]\) 各用一根)。
确定 \(j + 2\sim k\) 是如何生成的:\(g_{k - j - 1}\) 。
\(g_i\) 表示 \(2i\) 个数(123344...ii)中选出 \(i\) 个,并在地震后能形成 \(1 \sim i\) 的方案数(对应上文从 \([j + 2, k]\) 各两根,震出 \(j + 2 \sim k\))。
类似 \(f\) 的转移,我们枚举第一个位置的最终高度 \(j\):
\[g_i = \sum_{j = 1}^i\begin{pmatrix}i - 1\\j - 1\end{pmatrix} (i - j + 2) \times g_{j - 1} \times g_{n - j} \]选高度为 \([1, j - 1]\) 会被震成 \(0\),剩下 \([j + 1, n]\) 的柱子各被用掉一根,因此第一个位置有 \((i - j + 2)\) 种选择。
【清华集训2014】主旋律
P2595 [ZJOI2009] 多米诺骨牌
弃疗。
P4451 [国家集训队] 整数的lqp拆分
题意:\(1\le n\le 10^{100000}\),求
其中 \(f_0 = 0, f_1 = 1, f_i = f_{i - 1} + f_{i - 2}\)。
构造形式幂集数 \(F(x) = \sum_{i \ge 0} f_i x^i = \dfrac{x}{1 - x - x^2}\)。
\(m\) 恰好等于 \(k\) 的答案为 \([x^n] F(x)^k\)。
那么答案的生成函数等于 \(G(x) = \sum_{k \ge 1} F(x)^k\)。
解得
\(\sqrt 2\) 在模 \(10^9 + 7\) 下有二次剩余 \(59713600\)。

浙公网安备 33010602011771号