组合计数相关
放一些组合计数相关的题目。
P4492 [HAOI2018] 苹果树
一棵二叉树,初始只有一个根节点。每次随机在可能的位置接上一个节点来产生一个 \(n\) 个节点的二叉树,设树上节点两两距离之和的期望为 \(E\),求 \(n! \cdot E\) 在 \(\bmod P\) 意义下的值。
\(n \leq 2000\),\(P \leq 10^9 + 7\)
先考虑二叉树的方案数(注意这不是卡特兰),刚开始有两个位置可以放,每次放了之后会占一个位置,然后增加两个位置,于是每次位置数量增加 \(1\),于是方案数为 \(2 \times 3 \times \cdots n = n!\)。
于是相当于求所有可能形态的二叉树中两两距离之和的总和。
直接做不好做,我们考虑一条边 \((i, fa_i)\) 的贡献,显然是 \(siz_i (n - siz_i)\),发现 \(n \le 2000\),于是考虑枚举 \(siz_i = x\):
-
那么需要在 \([i + 1, n]\) 中选 \(x - 1\) 个点作为 \(i\) 的子树,根据我们之前的结论,\(x\) 个点的二叉树形态共有 \(x!\) 种,于是子树内的方案数是 \(\binom{n - i}{x - 1} x!\)。
-
然后考虑 \(i\) 子树外的点,首先对于 \([1, i]\) 内的点,有着 \(i!\) 不同形态的二叉树;然后对于后面的 \(n - i - x + 1\) 个点,不能接到 \(i\) 子树内,按照之前的分析,在 \(i\) 插入后,有着 \(i + 1\) 个位置可以放进去,由于不能是 \(i\) 子树内,所以要减去 \(i\) 贡献的两个儿子,于是初始可用位置数是 \(i - 1\),同理后面每次插入增加 \(1\) 个位置,于是方案数是 \((i - 1) \times i \times \cdots \times (n - x - 1) = \frac{(n - x - 1)!}{(i - 2)!}\)。
于是得到答案为:
化简一下得到:
直接做就是 \(O(N^2)\) 的。
P3343 [ZJOI2015] 地震后的幻想乡
给定一张 \(n\) 个点 \(m\) 条边的图,边的边权是 \([0, 1]\) 之间均匀分布的随机实数,且相互独立。求最小生成树的最大边权的期望值。结果保留 \(6\) 位小数。
\(n \leq 10\),\(m \leq \frac{n(n - 1)}{2}\)。
提示:对于 \(n\) 个 \([0, 1]\) 之间的随机变量 \(x_1, \dots, x_n\),第 \(k\) 小值的期望值是 \(\frac{k}{n + 1}\)。
考虑 kruskal 算法去求最小生成树的过程,即将边权从小到大依次加入进去,如果恰好加入第 \(k\) 条边后使得图联通,那么根据提示,其会造成 \(\frac{k}{m + 1}\) 的贡献,所以我们只需要求出这种情况的概率即可。
直接做不太好做,考虑 \([恰好加入时联通] = [加入前不联通] - [加入后不联通]\)。
发现数据范围较小,我们考虑状压:
-
令 \(cnt_S\) 表示在 \(S\) 导出子图上的边数。
-
令 \(f_{S, i}, g_{S, i}\) 表示在 \(S\) 中使用了 \(i\) 条边使得 \(S\) 不联通/联通的方案数。
考虑转移,钦定一个 \(S\) 中的数 \(x\),我们枚举其所在联通块 \(T\) 和其内边数转移:
同时显然,两者相加是总方案数:
令 \(U\) 为节点全集,最后答案是:
化简一下得到:
总时间复杂度是 \(O(3^n m^2)\) 的。
P3807 【模板】卢卡斯定理/Lucas 定理
求 \(\binom{n}{m} \bmod p\),\(p\) 为质数。
\(n, m, p \le 10^5\)
引理:
\[(a + b)^p \equiv a^p + b^p \pmod p \]
引理证明:
二项式定理展开:
\[(a + b)^p \equiv \sum_{k = 0}^p \binom{p}{k} a^k b^{p - k} \pmod p \]容易发现,当 \(1 \le k < p\) 时,\(\binom{p}{i} = \frac{p}{i} \binom{p - 1}{i - 1}\),由于 \(i\) 存在逆元,于是此时 \(\binom{p}{i} \equiv 0 \pmod p\),带回去,得到:
\[(a + b)^p \equiv a^p + b^p \pmod p \]
然后考虑证明 Lucas 定理:
考虑带余除法,设 \(n = ap + b, m = cp + d\),考虑这个多项式二项式展开:
其的 \([x^m]\) 项的系数就是 \(\binom{n}{m}\),然后根据引理以及带余除法可以得到:
于是可以得到:
系数对应一下,则 \(x^m = x^{cp + d}\),于是得到:
得证。
于是计算时,一直 Lucas 定理迭代使用,后面那一坨由于没有包含 \(p\),可以预处理 \(<p\) 的阶乘与阶乘逆元 \(O(1)\) 得到。
时间复杂度为 \(O(p + \log_p n)\)。
P4777 【模板】扩展中国剩余定理(EXCRT)
试求如下同余方程组的最小非负整数解:
其中,不保证 \(m_i\) 两两互质。
先考虑只有两个方程,考虑如何合并:
我们设第一个方程的解是 \(x = km_1 + a_1\),再次基础上满足第二个方程,考虑解出 \(k\),于是有:
这是标准的裴蜀定理,有解的充要条件是 \(\gcd(m_1, m_2) \mid a_2 - a_1\),设 \(d = \gcd(m_1, m_2)\),于是:
此时显然 \(\gcd(\frac{m_1}{d}, \frac{m_2}{d}) = 1\),于是存在逆元得到:
于是可以得到 \(k\) 的通解为 \(k = t \frac{m_2}{d} + k_0\),带入 \(x\) 的式子:
于是:
这样就将两个方程合并为一个,多个的情况依次合并即可。
时间复杂度为 \(O(N \log M)\)。
P2480 [SDOI2010] 古代猪文
计算 \(g^{\sum_{d \mid n} \binom{n}{d}} \bmod 999911659\),其中 \(n \leq 10^9\),\(g \leq 10^9\)。
容易发现 \(999911659\) 是质数,于是根据欧拉定理,我们需要算:
发现 \(999911658 = 2 \times 3 \times 4679 \times 35617\),于是可以对于每个质因子使用 Lucas 算,然后使用 CRT 合并即可。
时间复杂度为 \(O(\sqrt{n} \log n)\)。
P4345 [SHOI2015] 超能粒子炮·改
计算 \(\sum\limits_{k=0}^{m} \binom{n}{k} \bmod 2333\),其中 \(m \leq n \leq 10^{18}\)。
发现模数很小,往 Lucas 的方向去考虑,考虑将 \(k\) 按照 \(\lfloor \frac{k}{p} \rfloor\) 分组,具体的,我们令:
然后推一下式子:
然后我们可以提权预处理出 \(n, m < p\) 的 \(f(n, m)\) 值,显然是 \(p^2\) 的,过程中使用 Lucas 计算组合数即可,时间复杂度为 \(O(p^2 + T \log_p^2 n)\)。
link.
P4720 【模板】扩展卢卡斯定理/exLucas
求 \(\binom{n}{m} \bmod p\),\(p\) 不一定为质数。
\(m \le n \le 10^{18}, 2 \le p \le 10^6\)
在这之前,先说明几个符号:
-
\(v_p(n)\):表示 \(n\) 中 \(p\) 的幂次。
-
\((n)_p\):表示 \(n\) 中去掉 \(p\) 的幂次后得到的整数。
引理:Legendre 公式
对于正整数 \(n\),阶乘 \(n!\) 中素数 \(p\) 的幂次可以表示为:
证明比较显然,上述式子算的是对于每个 \(p^i\) 在 \(n\) 以内的倍数个数。
考虑 \([1, n]\) 中的一个数 \(x = p^t x'\),这个数的贡献在 \(i \in [1, t]\) 时作为 \(p^i\) 的倍数计算过,于是对于每个数,其的贡献恰好是其 \(p\) 的幂次,于是得证。
引理:素数模的递推公式
对于素数 \(p\) 和正整数 \(n\),有:
证明考虑推式子:
\[\begin{aligned} (n!)_p &\equiv \prod_{k = 1}^n (k)_p \\ &\equiv \left( \prod_{k = 1, k \perp p}^n k\right) \left( \prod_{k = 1}^{\lfloor \frac{n}{p} \rfloor} (pk)_p\right) \\ &\equiv \left( \prod_{i = 0}^{\lfloor \frac{n}{p} \rfloor - 1} \prod_{j = 1}^{p - 1} (ip + j)\right) \left( \prod_{k = 1}^{n \bmod p}(p \lfloor \frac{n}{p} \rfloor + k) \right) \left( \prod_{k = 1}^{\lfloor \frac{n}{p} \rfloor} (k)_p \right) \\ &\equiv \left( \prod_{i = 0}^{\lfloor \frac{n}{p} \rfloor -1} \prod_{j = 1}^{p - 1} j \right) \left( \prod_{k = 1}^{n \bmod p} k \right) (\lfloor \frac{n}{p} \rfloor!)_p \\ &\equiv (-1)^{\lfloor \frac{n}{p} \rfloor} (n \bmod p)! (\lfloor \frac{n}{p} \rfloor!)_p\end{aligned} \]过程中使用了威尔逊定理,证毕。
引理:素数幂模的递推公式
对于素数 \(p\) 和正整数 \(n\),有:
这里可以使用扩展威尔逊定理化简,但是证明过于复杂且时间复杂度几乎一致,所以没啥大必要,感兴趣的可以去 oi-wiki 上看看。
证明和上面的思路几乎一样:
\[\begin{aligned} (n!)_p &\equiv \left( \prod_{k = 1, k \perp p}^n k\right) \left( \prod_{k = 1}^{\lfloor \frac{n}{p} \rfloor} (pk)_p\right) \\ &\equiv \left( \prod_{i = 0}^{\lfloor \frac{n}{p^\alpha} \rfloor - 1} \prod_{j = 1, j \perp p}^{p^\alpha} (i p^\alpha + j))\right) \left( \prod_{i = 1, i \perp p}^{n \bmod p^\alpha} (p^\alpha \lfloor \frac{n}{p^\alpha} \rfloor + i) \right) (\lfloor \frac{n}{p} \rfloor !)_p \\ &\equiv \left( \prod_{i = 0}^{\lfloor \frac{n}{p^\alpha} \rfloor - 1} \prod_{j = 1, j \perp p}^{p^\alpha} j\right) \left( \prod_{i = 1, i \perp p}^{n \bmod p^\alpha} i\right) (\lfloor \frac{n}{p} \rfloor !)_p \\ &\equiv \left( \prod_{i = 1, i \perp p}^{p^\alpha} j \right)^{\lfloor \frac{n}{p^\alpha} \rfloor} \left( \prod_{j = 1, j \perp p}^{n \bmod p^\alpha} i \right) (\lfloor \frac{n}{p} \rfloor!)_p \pmod{p^\alpha} \end{aligned}\]证毕。
引理考虑完了,现在回到原问题,容易想到,先将 \(p\) 质因数分解 \(p_1^{\alpha_1} \cdots p_k^{\alpha_k}\),然后相当于求:
最后 exCRT 合并即可;于是现在问题是求 \(\binom{n}{m} \bmod p^k\),考虑展开:
现在关键是 \(m!, (n - m)!\) 中可能含有 \(p\) 这个因子导致不存在逆元,于是考虑提出来:
此时 \((m!)_p, ((n - m)!)_p\) 与 \(p^k\) 就肯定是互质的,存在逆元,使用 exgcd 即可求出。
然后计算 \((n!)_p, v_p(n!)\) 使用之前的引理即可,注意需要预处理 \(pm_n\) 表示 \([1, n]\) 中不是 \(p\) 的倍数的数的乘积即可快速递归。
时间复杂度为 \(O(\log n + p)\)。
P10594 BZOJ2445 最大团
一个 \(n\) 个点的无向图被叫做是一个好图,当且仅当该图的任意一个极大连通子图拥有相同的点数,并且任意一个极大连通子图都是完全图。
现有 \(m\) 种颜色和所有含有 \(n\) 个点且节点有标号的好图。我们需要将每个好图都染上一种颜色,两个不同的好图可以染相同颜色,求方案数对 \(10^9 - 401\) 取模的结果。
\(n, m \le 2 \times 10^9\)
考虑每个子图的大小 \(d\),那么相当于将 \(n\) 个点划分为 \(\frac{n}{d}\) 个大小为 \(d\) 的组的方案数,一般来说是:
但是这样我们是钦定了分组的顺序的,而染色显然是不区分的,于是多算了 \((\frac{n}{d})!\) 的贡献。
所以我们的答案是:
考虑费马小定理,我们只需要算 \(\sum\limits_{d \mid n} \frac{n!}{(d!)^{\frac{n}{d}} (\frac{n}{d})!} \bmod {10^9 - 402}\) 的值,发现 \(10^9 - 402 = 2 \times 13 \times 5281 \times 7283\),于是可以对每个质因子算出模它后的值,最后 CRT 合并即可。
考虑如何算 \(\frac{n!}{(d!)^{\frac{n}{d}} (\frac{n}{d})!} \bmod p\)(\(p\) 为质数),首先朴素算不太可能,考虑 exLucas 的思路,计算 \(\frac{(n!)_p}{(d!)_p^{\frac{n}{d}} (\frac{n}{d}!)_p} \cdot p^{v_p(n!) - \frac{n}{d}v_p(d) - v_p(\frac{n}{d})}\) 即可。
时间复杂度为 \(O(\sqrt{n} \log n)\)。
P3726 [AHOI2017/HNOI2017] 抛硬币
给定 \(n, m, k\),求有多少对 \(01\) 串 \(s\) 和 \(t\) 满足:
- \(|s| = n\),\(|t| = m\);
- \(s\) 中 \(1\) 的数量大于 \(t\) 中 \(1\) 的数量。
答案对 \(10^k\) 取模。其中 \(n, m \leq 10^{15}\),\(0 \leq n - m \leq 10^4\),\(1 \leq k \leq 9\)。
考虑枚举 \(s\) 中 \(1\) 的数量 \(i\)(也可以转化为枚举相对于 \(t\) 中 \(1\) 的数量 \(j\) 的增量),于是显然答案是:
过程中使用了范德蒙雷卷积。
现在就可以直接 exLucas 去计算了,但是会 TLE,注意到 \(n - m \le 10^4\),考虑折半优化一下:
这样即可做到 \(O(2^k + 5^k + T (n - m) \log n)\)。
二项式反演
令 \(f(i)\) 表示钦定某 \(i\) 个的方案数,\(g(n)\) 表示恰好选 \(i\) 个的方案数,最常用的式子:
左式:考虑组合意义,对于每个 \(i \ge n\),考虑 \(g(i)\) 的每种可能方案,钦定某 \(n\) 个时,钦定这 \(i\) 个中的任意 \(n\) 个都会算一次这个方案,于是 \(g(i)\) 带给 \(f(n)\) 的贡献应该是 \(\binom{i}{n} g(i)\)。
右式:带入进去爆推
\[\begin{aligned} f(n) &= \sum_{i = n}^m \binom{i}{n} g(i) \\ &= \sum_{i = n}^m \binom{i}{n} \sum_{j = i}^m (-1)^{j - i} \binom{j}{i} f(j) \\ &= \sum_{j = n}^m f(j) \sum_{i = n}^j (-1)^{j - i} \binom{j}{i} \binom{i}{n} \\ &= \sum_{j = n}^m f(j) \sum_{i = n}^j (-1)^{j - i} \binom{j - n}{i - n}\binom{j}{n} \\ &= \sum_{j = n}^m f(j) \binom{j}{n} \sum_{i = n}^{j} (-1)^{j - i} \binom{j - n}{i - n} \\ &= \sum_{j = n}^mf(j) \binom{j}{n} \sum_{i = n}^j (-1)^{j - i} \binom{j - n}{j - i} \\ &= \sum_{j = n}^mf(j) \binom{j}{n} \sum_{k = 0}^{j - n} (-1)^k \binom{j - n}{k} \\ &= \sum_{j = n}^m f(j) \binom{j}{n} (1 - 1)^{j - n} \\ &= \sum_{j = n}^m f(j) \binom{j}{n} [j = n] \\ &= f(n) \end{aligned}\]得证。
在多个集合的交/并集大小只和集合的数目有关时,令 \(f(i)\) 表示 \(i\) 个集合的补集的交的大小,\(g(i)\) 表示 \(i\) 个集合的交集大小,那么有(注意 \(f(0) = g(0) = |U|\)):
直接根据集合的性质与容斥原理爆推式子:
\[\begin{aligned} f(n) &= |\overline{A_1} \cap \overline{A_2} \cdots \cap \overline{A_n}| \\ &= |U| - |A_1 \cup A_2 \cup \cdots \cup A_n| \\ &= |U| - \sum_{i = 1}^n |A_i| + \sum_{1 \le i <j \le n} | A_i \cap A_j| - \cdots + (-1)^n |A_1 \cap \cdots \cap A_n| \\ &= \sum_{i = 0}^n (-1)^i \binom{n}{i} g(i) \end{aligned} \]\[\begin{aligned} g(n) &= |A_1 \cap \cdots \cap A_n| \\ &=|U| - |\overline{A_1} \cup \overline{A_2} \cdots \cup \overline{A_n}| \\ &= |U| - \sum_{i = 1}^n |\overline{A_i}| + \sum_{1 \le i <j \le n} | \overline{A_i} \cap \overline{A_j}| - \cdots + (-1)^n |\overline{A_1} \cap \cdots \cap \overline{A_n}| \\ &= \sum_{i = 0}^n (-1)^i \binom{n}{i} f(i)\end{aligned} \]得证。
一个推广(证明显然):
P10596 BZOJ2839 集合计数
有 \(n\) 个元素,问有多少种选择若干个子集的方案,使得选出的子集的交集大小恰好为 \(k\)。
其中 \(0 < k \leq n \leq 10^6\)。
考虑令 \(f(i)\) 表示钦定某 \(i\) 个元素是在交集内,\(g(i)\) 表示恰好 \(i\) 个元素在交集内,容易得到 \(f(i) = \binom{n}{i} (2^{2^{n - i}} - 1)\),那么根据二项式反演有:
直接算即可,时间复杂度为 \(O(N \log N)\)。
P10681 [COTS 2024] 奇偶矩阵 Tablica
考虑只包含 \(0\) 和 \(1\) 的 \(N \times M\) 矩阵 \(A\)。我们称满足以下条件的矩阵是好的:
- \(\forall\ 1 \leq i \leq N, \sum_{j=1}^M A_{i,j} \in \{1, 2\}\);
- \(\forall\ 1 \leq j \leq M, \sum_{i=1}^N A_{i,j} \in \{1, 2\}\)。
求出 \(N\) 行 \(M\) 列的好的矩阵的数量,对 \((10^9 + 7)\) 取模。
其中 \(N, M \leq 3000\)。
看起来没啥思路,随便一个设 \(a, b\) 为 \(n\) 行中和为 \(1\) 的行数与和为 \(2\) 的行数,\(c, d\) 为 \(m\) 列中和为 \(1\) 的列数与和为 \(2\) 的列数,那么可以得到:
于是我们枚举其中任意一个都可以解出其它三个。
考虑现在得到了 \(a, b, c, d\) 如何算答案,发现行列的影响其实不是很大,可以将问题等价转化为:
- 有 \(m\) 种颜色的小球,其中颜色为 \([1, c]\) 有一个,颜色为 \([c + 1, m]\) 的有两个。
- 将这些球放入 \(n\) 个有标号的集合中,使得恰有 \(a\) 个集合只放一个球,恰好 \(b\) 个集合里放了两个球,且不能将同一个颜色的球放入同一个集合中。
- 求放置的方案数。
考虑经典的,按照某种特定方法去放置,然后计算少算的/算重的/不合法的。
这里我们可以对于这 \(c + 2d\) 个球的任意排列,将前 \(a\) 个球单独放入一个集合中,然后后面 \(2b\) 个球,相邻两个一组放入同一个集合。
然后这样我们产生的问题是:
-
对于后面的 \(2b\) 对,可能会出现两个相同颜色的球放在一起,直接做不好做,考虑容斥;若钦定了 \(i\) 组是相同的,首先有 \(\binom{b}{i}\) 的系数,然后再在 \(d\) 种颜色中选 \(i\) 种 \(\binom{d}{i}\) 表示重复的颜色是哪些,然后这 \(i\) 组的顺序是可以任意排列的 \(i!\),然后还剩下 \((c + 2d - 2i)\) 个球,任意排列的方案是数是 \(\frac{(c + 2d - 2i)!}{2^{d - i}}\)。
-
对于后面的 \(2b\) 对,若有一组方案是 \((x_1, y_1), (x_2, y_2), \cdots, (x_b, y_b)\),那么括号内的元素交换位置后其实是等价的,于是最后的合法总方案数要除以 \(2^b\)。
于是整理一下,最后的答案为:
时间复杂度为 \(O(N^2)\)。
P3214 [HNOI2011] 卡农
在集合 \(S = \{1, 2, \dots, n\}\) 中,选出 \(m\) 个无序的互不相同的非空子集,使得每个元素的出现次数均为偶数。求选择方案数 \(\bmod (10^8 + 7)\)。
其中 \(n, m \leq 10^6\)。
这个无序的条件很弱,考虑先算有序的答案,最后除以 \(m!\) 即可。
考虑 dp,定义 \(dp_i\) 表示选了 \(i\) 个集合合法的方案数,直接转移发现特别困难,考虑容斥,用总方案数减去不合法的:
-
总方案数:对于前面 \(i - 1\) 个集合,可以在 \(2^n - 1\) 个集合中随便选,然后第 \(i\) 个集合根据每个数出现此时的奇偶性可以唯一确定。
-
\(i\) 为空集:有限制不能选出空集,所以只有当前 \(i - 1\) 个集合已经合法的时候 \(i\) 才能是空集。
-
\(i\) 唯一和前面某个选的 \(j\) 相同:显然删掉他们后剩下 \(i - 2\) 个集合依然合法,\(i\) 的选法是 \(2^n - 1 - (i - 2) = 2^n - i + 1\)。
于是有转移:
考虑:
于是:
直接做即可,时间复杂度为 \(O(N + M)\)。
P4781 【模板】拉格朗日插值
对于 \(n\) 个点 \((x_i,y_i)\),如果满足 \(\forall i\neq j, x_i\neq x_j\),那么经过这 \(n\) 个点可以唯一地确定一个 \(n-1\) 次多项式 \(y = f(x)\)。
现在,给定这样 \(n\) 个点,请你确定这个 \(n-1\) 次多项式,并求出 \(f(k) \bmod 998244353\) 的值。
考虑构造 \(n\) 个函数,第 \(i\) 个函数 \(f_i(x)\) 满足:
-
过 \((x_i, y_i)\)。
-
过 \(j \ne i, (x_i, 0)\)。
那么显然我们要求的函数就是:
考虑待定系数,设:
带入 \((x_i, y_i)\) 可以得到:
于是:
那么得到:
本题就可以直接带入 \(x = k\) 然后 \(O(n^2)\) 求得点值,可以通过。
扩展:在 \(x\) 取值连续时
在 \(x\) 连续的时候,我们以 \(x_i = i\) 为例子,那么我们有:
考虑分子分母分开考虑,对于分子,容易发现是:
对于分子,发现可以拆成两段的阶乘:
于是:
预处理 \((x - i)\) 的前后缀乘积与阶乘与阶乘逆即可做到 \(O(N)\)。
CF622F The Sum of the k-th Powers
给定 \(n, k\),求:
\(n \le 10^9, k \le 10^6.\)
容易发现设:
那么 \(f(n)\) 是关于 \(n\) 的 \(k + 1\) 次多项式,于是我们可以求出 \(f(1), \cdots, f(k + 2)\),然后使用推广的 \(x_i\) 连续的拉格朗日插值即可。
时间复杂度为 \(O(k \log p)\)。
P3270 [JLOI2016] 成绩比较
王哥班上有 \(n\) 个人,\(m\) 门课,每位同学在第 \(i\) 门课上的分数是 \([1, U_i]\) 之间的一个整数。已知王哥每门课的排名,第 \(i\) 门课的排名为 \(R_i\)。
其中排名的定义为:有且仅有 \(R_i - 1\) 位同学这门课的分数大于王哥的分数,有且仅有 \(n - R_i\) 位同学这门课的分数小于等于王哥(不包括他自己)。
此外,还知道恰好有 \(k\) 位同学每门课成绩都小于等于王哥的成绩(称这 \(k\) 位同学被王哥碾压),求合法的得分情况的方案数 \(\bmod (10^9 + 7)\)。
其中 \(n, m \leq 100\),\(U_i \leq 10^9\)。
思路比较顺,首先想到先选 \(k\) 个同学被王哥碾压,方案数为 \(\binom{n - 1}{k}\)。
然后考虑其它 \(n - k - 1\) 个同学,其在每门课中与王哥排名的相对大小,因为需要存在至少一门课使得其排名比王哥高,容易想到这个式子:
即在剩下的同学中,对于每个科目都选 \(R_i - 1\) 人排在王哥前面;但是这样会出现一个人在每个科目都没有选的情况,会多算一些情况,于是考虑容斥。
设集合 \(A_i\) 表示第 \(i\) 个人在每个科目都没有选的情况集合,我们要算 \(|\overline{A_1} \cap \cdots \overline{A_{n - k - 1}}|\),容斥后我们相当于要算钦定某 \(j\) 个人都不选的方案数,显然是 \(\prod\limits_{i = 1}^m \binom{n - k - j - 1}{R_i - 1}\),于是可以得到式子:
此时我们求出来的方案数是王哥每门课前面和后面的总不同集合个数,现在我们来考虑分数;对于每门课 \(i\),尝试枚举王哥的分数 \(j\) 去计数:
后面的是自然数幂和,可以拉格朗日插值解决。
最后将三部分相乘即可,时间复杂度为 \(O(mn^2)\)。
CF997C Sky Full of Stars
有一个 \(n \times n\) 的矩阵,将其三染色,使得至少有一行或者一列同色,问方案数。
\(n \leq 10^6.\)
发现不好直接做,这种至少的容易想到容斥,求总方案数减去不存在任意一行且一列同色的方案数。
如果同时有非 \(0\) 的行与列同色,那么这两染的是一个色,这是显然的。
于是我们设 \(G(i, j)\) 表示恰好有 \(i\) 行 \(j\) 列同色的方案数,\(F(i, j)\) 表示钦定有 \(i\) 行 \(j\) 列同色的方案数,那么有:
发现两维基本独立,考虑高维的二项式反演得到:
于是我们要求的是:
然后来考虑 \(F(i, j)\),发现当 \(i = 0, j = 0\) 时式子有影响,于是:
-
\(F(i, 0) = \binom{n}{i} 3^{n(n - i) + i}\)。
-
\(F(0, j) = \binom{n}{j} 3^{n(n - j) + j}\)。
-
\(F(i, j) = \binom{n}{i} \binom{n}{j} 3 \cdot 3^{(n - i)(n - j)}\)。
然后对于 \(G(0, 0)\) 的式子,我们可以 \(O(n)\) 枚举 \(i = 0\) 或者 \(j = 0\) 的去暴力算 \(F(i, 0), F(j, 0)\)。
现在我们来考虑 \(i > 0, j > 0\) 的,即这个式子:
过程中使用了二项式定理,枚举 \(i%\) 即可做到 \(O(n \log n)\)(快速幂的 \(\log\))。
P5339 [TJOI2019] 唱、跳、rap和篮球
\(cdqz\) 要组织 \(n\) 个学生参观博物馆,要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类:一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢 \(rap\),还有一部分最喜欢篮球。
如果存在 \(k\) 使得队列中 \(k, k+1, k+2, k+3\) 位置上的同学依次,最喜欢唱、跳、\(rap\)、篮球,那么他们就会聚在一起讨论蔡徐坤。
校领导不希望这种事情发生,因为这会使得队伍显得很乱,你需要求出有多少种排队的方法,不会有学生聚在一起讨论蔡徐坤。
两个学生队伍被认为是不同的,当且仅当两个队伍中至少有一个位置上的学生的喜好不同。种类数对 \(998244353\) 取模。
\(0 < n \leq 1000, a, b, c, d \le 500\)
转化一下,即 \(a + b + c + d\) 个四种颜色的人,选出 \(n\) 个人排成一列,不存在颜色 \([1, 2, 3, 4]\) 的子区间的方案数(两个方案不同当且仅当一个位置的颜色不同)。
显然容易想到容斥,我们设 \(f(k)\) 表示钦定有 \(k\) 个 \([1, 2, 3, 4]\) 的方案数,\(g(k)\) 为恰好有 \(k\) 个 \([1, 2, 3, 4]\) 的方案数,令 \(m = \min(\{a, b, c, d, \lfloor \frac{n}{4} \rfloor \})\);显然有:
于是二项式反演得到:
我们要求 \(g(0)\),相当于求出所有的 \(f(k)\)。
我们设 \(S(n, a, b, c, d)\) 表示四种颜色的数量分别为 \(a, b, c, d\),选 \(n\) 个任意排成一行的方案数,那么容易得到:
考虑如何求 \(S(n, a, b, c, d)\),即长度为 \(n\) 的段,每个颜色有数量限制,染四种颜色的方案数,发现可以用 EGF 刻画,对于一个有 \(k\) 个同种颜色的 EGF 是 \(\sum\limits_{i = 0}^k \frac{x^i}{i!}\),将这四个多项式卷起来后第 \(n\) 项乘上 \(n!\) 就是对的。
暴力卷是 \(a^2\) 的,外层还有枚举的 \(k\),总时间复杂度为 \(O(na^2)\);常数很小,可以通过。
子集反演
如果:
那么有:
证明是容易的,带入后只需要证明:
令 \(Y = S \setminus X\),那么 \(T = X \cup Z\),其中 \(Z \subseteq Y\),于是问题转化为:
枚举 \(Z\) 的大小为 \(k\),就是:
得证。
P3349 [ZJOI2016] 小星星
先容斥一波,定义 \(f_S\) 表示恰好映射到 \(S\) 中每个点至少一次的方案数,\(g_S\) 表示钦定映射到了 \(S\) 的方案数(不需要每个点都被映射),那么显然有:
子集反演后有:
于是答案就是 \(f_U\),于是问题就是算每个 \(g\)。
考虑枚举 \(S\),如何快速算 \(g_S\),容易列出树形 dp,定义 \(dp_{u, i}\) 表示考虑 \(u\) 子树内,\(u\) 映射到 \(i\) 的方案数,没添加一个儿子 \(v\),有转移:
单次时间复杂度是 \(O(n^3)\),于是总复杂度是 \(O(2^n n^3)\),可以通过。
Min-Max 容斥
Min-Max 容斥,又称最值反演,其适用于在 Max/Min 两者之一已知或者比较好算的情况下,求另一者。
一般形式:
考虑构造性证明,假设存在函数 \(f(|T|)\) 满足:
\[Max(S) = \sum_{T \subset S, T \ne \emptyset} f(|T|) Min(T) \]考虑设 \(S\) 中的数从大到小排序,设为 \(a_1, \cdots, a_n\);那么我们考虑每个 \(a_i\) 带来的贡献:
- 对于 \(Max(S)\):只有 \(a_1\) 才有贡献,于是 \(a_i\) 带来的贡献是 \([i = 1]\)。
- 对于 \(\sum\limits_{T \subset S, T \ne \emptyset} f(|T|) Min(T)\):考虑 \(Min(T)\) 的贡献是下标最大的那个最小值贡献的,于是 \(a_i\) 的贡献相当于强制选了 \(i\) 然后再前面 \(i - 1\) 个中任意选,于是贡献是 \(\sum\limits_{j = 0}^{i - 1} f(j + 1) \binom{i - 1}{j}\)。
此时得到式子,对于所有 \(i\),需要满足:
\[[i = 1] = \sum_{j = 0}^{i - 1} \binom{i - 1}{j} f(j + 1) \]发现看起来根二项式反演比较像,考虑转化为标准形式,令 \(F(i) = [i = 0], G(i) = f(i + 1)\),于是:
\[F(i) = \sum_{j = 0}^i \binom{i}{j} G(j) \]那么二项式反演得到:
\[G(i) = \sum_{j = 0}^i (-1)^{i - j} \binom{i}{j} F(j) = (-1)^i \]于是 \(f(i) = G(i - 1) = (-1)^{i - 1}\),那么得到:
\[Max(S) = \sum_{T \subset S, T \ne \emptyset} (-1)^{|T| - 1} Min(T) \]得证。
推广形式:
一般的,可能会求第 \(k\) 大或者第 \(k\) 小:
类似的,考虑构造性证明,假设存在函数 \(f(|T|)\) 满足:
\[kMax(S) = \sum_{T \subset S, T \ne \emptyset} f(|T|) Min(T) \]考虑设 \(S\) 中的数从大到小排序,设为 \(a_1, \cdots, a_n\);那么我们考虑每个 \(a_i\) 带来的贡献:
- 对于 \(Max(S)\):只有 \(a_k\) 才有贡献,于是 \(a_i\) 带来的贡献是 \([i = k]\)。
- 对于 \(\sum\limits_{T \subset S, T \ne \emptyset} f(|T|) Min(T)\):贡献是和之前一样的 \(\sum\limits_{j = 0}^{i - 1} f(j + 1) \binom{i - 1}{j}\)。
此时得到式子,对于所有 \(i\),需要满足:
\[[i = k] = \sum_{j = 0}^{i - 1} \binom{i - 1}{j} f(j + 1) \]令 \(F(i) = [i = k - 1], G(i) = f(i + 1)\),于是得到:
\[F(i) = \sum_{j = 0}^i \binom{i}{j} G(j) \]二项式反演得到:
\[G(i) = \sum_{j = 0}^i (-1)^{i - j} \binom{i}{j} F(j) = (-1)^{i - k + 1} \binom{i}{k - 1} \]于是 \(f(i) = G(i - 1) = (-1)^{i - k} \binom{i - 1}{k - 1}\),那么得到:
\[kMax(S) = \sum_{T \subset S, |T| \ge k} (-1)^{|T| - k} \binom{|T| - 1}{k - 1}Min(T) \]得证。
期望形式:
由于期望的线性性,是可以直接套的:
注意上面的所有 \(Max/Min\) 都是可以交换的。
P4707 重返现世
给 \(n\) 个元素,每次会随机选择一个,有 \(\frac{p_i}{m}\) 的概率选择第 \(i\) 个,问第一次有 \(k\) 元素被选择过的期望时间。
\(1 \le n \le 1000, 1\le k \le n, n - k \le 10, 1 \le p_i \le m , 1 \le \sum p_i = m \le 10^4\)
首先 \(k \gets n - k + 1\) 转化为求第 \(k\) 大的期望,于是直接套 kMin-Max 式子,答案是:
考虑如何求 \(E(Min(S))\),首先每次取一个 \(S\) 中的数的概率是:
于是有:
考虑令:
那么:
于是:
带入回去:
于是我们要求的是:
发现还是不太好算,考虑运用题目里的范围限制 \(m \le 10^4\)。
发现当 \(|T|\) 和 \(\sum_{i \in T} p_i\) 已知时是好做的,于是考虑求出满足这两个限制的集合 \(T\) 的个数即可。
考虑背包的去算,具体的,考虑令 \(f_{i, j, x}\) 表示考虑前 \(i\) 个数,选了 \(j\) 个数,使得 \(\sum p = x\) 的集合数量,那么可以得到转移:
但是这样时间复杂度是 \(O(n^2m)\) 的,没有用到 \(k \le 10\) 这个限制。
但是这个转移我们已经做到 \(O(1)\) 了,考虑从状态上进行优化,考虑把 \(k\) 这个比较小的带进去。
我们定义 \(f_{i, k, x}\) 表示考虑前 \(i\) 个数,答案式子中为 \(k\) 时 \(\sum p_i = x\) 的贡献系数,即:
分情况讨论:
-
若不选 \(i\):贡献是 \(f_{i - 1, k, x}\)。
-
若选了 \(i\),考虑推式子:
于是可以得到:
然后考虑边界条件 \(f_{i, 0, 0} = 1\)。
最后答案是:
时间复杂度为 \(O(nmk)\)。
P3600 随机数生成器
生成一个长为 \(n\) 的随机序列,值域为 \([1,x]\) 中的整数。再给 \(q\) 个区间,求这些区间最小值的最大值的期望。
\(n,x,q \leq 2000\)
首先 Min-Max 容斥一下,我们有:
这里:
于是问题等价于,选择一些区间,考察这些区间的并的大小,以及其奇偶性算贡献。
为了方便计算,我们需要求出长度为 \(x\) 的区间的期望最小值的大小 \(F_x\).
具体的,考虑令 \(f_{i, j}\) 表示考虑前 \(i\) 个数,最小值为 \(j\) 的概率,那么有转移:
朴素前缀和优化即可做到 \(O(nx)\),然后有:
我们设 \(dp_{i, j, 0/1}\) 表示考虑前 \(i\) 个区间(必选第 \(i\) 个),目前选了偶数/奇数个区间,且并的大小为 \(j\) 的方案数,那么答案显然是:
考虑如何转移,首先显然,如果一个区间包含了其他的区间,那么其肯定是对答案没有贡献的,可以删掉。
于是将所有区间按照左端点从小到大排序,此时左右端点都是单调的,于是可以枚举上次选的区间 \(k\) 然后分相交相离两个情况转移即可:
这样时间复杂度来到了 \(O(n^3)\),考虑优化。
由于 \(l, r\) 都是单增的,所以我们可以走指针维护所有 \([r_k < l_i]\) 与 \([r_k \ge l_i]\) 的部分;即我们设 \(A_{x, op}\) 表示所有满足 \([r_k < l_i]\) 的 \(k\) 的 \(dp_{k, x, op}\) 的和;然后设 \(B_{x, op}\) 表示所有满足 \([r_k \ge l_i]\) 的 \(k\) 的 \(dp_{k, r_k - x, op}\) 的和。
那么有:
走指针时,动态插入删除即可。
时间复杂度为 \(O(N^2)\)。
P1758 [NOI2009] 管道取珠
略。
考虑 \(a_i^2\) 的组合意义:
- 即两个人在独立的管道上玩这个游戏,最后得到相同序列的方案数。
于是考虑动态规划,定义 \(dp_{i, j, k}\) 表示两人共取了 \(i\) 个柱子,第一个人在第一个管道取了 \(j\) 个,第二个人在第二个管道取了 \(k\),使得取出的柱子序列相同的方案数。
转移时,看 \(a_j = a_k, a_j = b_{i - k}, b_{i - j} = a_k, b_{i - j} = b_{i - k}\) 这几种情况转移即可。
时间复杂度为 \(O(n^3)\),需要滚动数组。
P11030 『DABOI Round 1』Blessings Repeated
给定一个正整数 \(k\) 和两个字符串 \(S,T\)。
设字符串 \(s\) 为 \(k\) 个字符串 \(S\) 首尾相接得到的字符串。
求 \(s\) 中有多少个子序列为 \(T\)。
\(0 < k \le 10^{18}, 0 < |S| \le 5 \times 10^3, 0 < |T| \le 10\)
考虑 \(T\) 在 \(s\) 中作为子序列出现的形式,可以看作是将 \(T\) 切成若干段,放到这 \(k\) 个 \(S\) 中分别出现。
此时注意到 \(T\) 的长度很小,于是考虑暴力 \(O(2^{|T|})\) 去爆搜所有 \(T\) 的切割方案,设当前爆搜的是 \([l_1 = 1, r_1], \cdots, [l_m, r_m= |T|]\);此时令 \(f_{l, r}\) 表示 \(T[l : r]\) 在 \(S\) 中作为子序列出现的次数,最后再算上把这切开的 \(m\) 个段放入 \(k\) 个 \(S\) 中的方案数,那么此时这个分段的贡献是:
求 \(f_{l, r}\) 是简单的,直接 dp 即可。
时间复杂度为 \(O(|T| 2^{|T|} + |T|^3 |S|)\)。
显然可以对分段方式进行 dp,做到 poly,但是这题没必要了。
P4516 [JSOI2018] 潜入行动
给定一个 \(n\) 个点的树,求有多少选取 \(k\) 个点的方案数,使得任意一个点都至少与这 \(k\) 个点中的一个点直接相连(对于这 \(k\) 个点本身,不与自己相连)。
\(n \le 10^5, k \le 100.\)
考虑树上 dp,定义 \(dp_{u, i, 0/1, 0/1}\) 表示 \(u\) 子树内选了 \(i\) 个点,除了 \(u\) 以外的点已经被覆盖了,是否选了 \(u\),以及 \(u\) 是否被覆盖的方案数;那么答案显然是 \(dp_{1, k, 0, 1} + dp_{1, k, 1, 1}\)。
考虑如何转移,假设加入 \(v\) 这个儿子后,分情况:
- \(u\) 没有被选,也没被覆盖:
- \(u\) 没有被选,但是被覆盖:
- \(u\) 被选,但是没被覆盖:
- \(u\) 被选,且被覆盖:
树上背包转移即可;时间复杂度为 \(O(nk)\)。
P9129 [USACO23FEB] Piling Papers G
有 \(N\) 张写着数字的纸片排成一排,给定 \(A,B\)。
希望你回答 \(Q\) 个查询。每次查询,将左到右遍历纸片 \(l\) 到 \(r\)。有一个最初为空的纸片堆。遍历到张纸片,它们可以选择将其添加到堆的顶部、底部,或者不添加。最后,它们将从顶部到底部读取堆中的纸片,形成一个整数。在奶牛们在此过程中做选择的所有 \(3^{r_i - l_i + 1}\) 种方式中,计算出结果在 \([A,B]\) 范围内的方式数量,并输出这个数量对 \(10^9 + 7\) 取模的结果。
其中 \(N \leq 300\),\(Q \leq 5 \times 10^4\)。
先考虑全局 \(l = 1, r = n\) 怎么做。
首先差分一下 \([A, B] = [1, A] - [1, B - 1]\),设我们现在要求 \(\le x\) 的答案。
然后考虑数位 dp,发现直接做不太行,因为一个数既可以插在前面,还可以插在后面,如何只记录前缀的话,那么插在前面是不容易判断大小的。
所以考虑区间形式的状态,定义 \(dp_{i, l, r, 0/1/2}\) 表示考虑前 \(i\) 个数,其中选择了 \(r - l + 1\) 个数,对应 \(x\) 的 \([l, r]\) 数位,与其的相对大小关系是小于,等于,大于的方案数。
设 \(x\) 的位数是 \(m\),那么答案容易发现是:
即考虑最终形成的位数,当位数等于 \(m\) 时,不能大于 \(x\),位数小于 \(m\) 时,可以任意。
转移时考虑 \(a_j\) 放在左右两边的情况即可。
这样时间复杂度可以做到 \(O(q n \log^2 w)\),无法通过,因为 \(q\) 比较大,考虑提前预处理出每个区间的答案,即可 \(O(1)\) 查询,时间复杂度为 \(O(n^2 \log^2 w + q)\)。
P3158 [CQOI2011] 放棋子
在一个 \(m\) 行 \(n\) 列的棋盘里放一些棋子,总共 \(c\) 种颜色,第 \(i\) 种棋子有 \(a_i\) 个,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列,有多少种方法?
\(1 \le n, m \le 30, 1 \le c \le 10, \sum a \le n m\)
范围比较小,状态可以设大胆一点。
我们称一行或者一列被占领了当且仅当这一行或者一列中有棋子;由于同种颜色棋子之间限制是好放的,考虑依次对颜色 dp。
定义 \(dp_{k, i, j}\) 表示使用前 \(k\) 种颜色的棋子,恰好占领了 \(i\) 行 \(j\) 列的方案数,那么显然答案是:
考虑如何转移,即枚举上 \(k - 1\) 种颜色占领的行列数,然后再算用 \(a_k\) 个棋子去填空缺:
这里 \(f_{k, i, j}\) 表示用 \(k\) 个同色的棋子恰好占领了 \(i\) 行 \(j\) 列的方案数,你手摸画一下图,显然只有中间交集的部分 \(i \times j\) 的矩形能放去棋子,考虑容斥,用总方案数减去没有恰好占领的方案数:
容易发现这样是不会算重的,直接做即可,时间复杂度为 \(O(n^2 m^2 c)\)。
[AHOI2018初中组]球球的排列 / CF840C On the Bench
给定序列 \(a\),求有多少种重排方式使得任意两个相邻元素之积均不是平方数。
\(n \le 300\)
容易发现乘积是平方数是可以传递的,即若 \(xy\) 是平方数,\(yz\) 是平方数,那么 \(xz\) 也是平方数。
于是可以使用并查集维护每个块,每个块染一个色;那么问题转化为了 \(n\) 个有标号有颜色的球,求相邻球不同色的排列方式。
发现 \(n\) 比较小,考虑 dp 的时候多记录一些;然后对于同种颜色的球一起考虑可能要容易一些,于是首先将球按照颜色排序。
我们定义 \(dp_{i, j, k}\) 表示已经排列了前 \(i\) 个球,相邻同色的对有 \(j + k\) 对,其中有 \(j\) 对与 \(i\) 不同色(即有 \(k\) 对是 \(i\) 这种颜色的同色对),考虑转移,即将第 \(i\) 个球插入到前面:
- 若 \(col_i \ne col_{i - 1}\),且插入到前面两个不同色的球之间(包括开头结尾),这是新的第一个颜色,于是只能转移到 \(dp_{i, j, 0}\),枚举前面与 \(col_{i - 1}\) 不同色的同色对数量 \(j'\) 即可;容易发现不同色的球之间的空位数量应该是 \(i - j\):
- 若 \(col_i \ne col_{i - 1}\),且插入到前面两个同色球之间,于是必然会减少一个同色对;也是只能转移到 \(dp_{i, j, 0}\),那么前面 \(i - 1\) 个中有 \(j + 1\) 个同色对,可以随便选一个插入进去,同样枚举 \(j'\) 即可:
- 若 \(col_i = col_{i - 1}\),且插入到与它颜色相同的球旁边(设前面插入了 \(x\) 个 \(col_i\) 颜色的球),于是同色对会增加 \(1\),那么:
- 若 \(col_i = col_{i - 1}\),且插入到与它异色的两个同色球对之间,那么同色对减少 \(1\),于是:
- 若 \(col_i = col_{i - 1}\),且插入到与它异色的两个异色球对之间,那么同色对不变,插入的方案数用总的 \(i\) 减去前面两种情况,于是:
直接做即可,时间复杂度为 \(O(n^3)\)。
当然,本题存在着只需要数学推式子容斥可以做到的 \(O(n^2)\) 做法,先咕咕咕。
P10008 [集训队互测 2022] Range Minimum Element
有一个长度为 \(n\),值域为 \([1,c]\) 的正整数序列 \(a\)。给定 \(m\) 个区间 \([l_i, r_i]\),设长度为 \(m\) 的序列 \(b\) 满足 \(\forall i \in [1,m], b_i = \min\limits_{j=l_i}^{r_i}\{a_j\}\)。
求出 \(a\) 在范围内任意取的情况下共能得到多少种不同的 \(b\)。答案对 \(998244353\) 取模。
其中 \(1 \leq n \leq 100\),\(1 \leq m \leq \dfrac{n(n + 1)}{2}\),\(1 \leq c < 998244353\),\(\forall i \in [1,m], 1 \leq l_i \leq r_i \leq n\)。
这种题,直接做是困难的,就是考虑构造一组 \(b \to a\) 的单射,然后统计 \(a\) 即可,显然这个 \(a\) 是加了限制条件的。
对于一组固定的 \(b\),其对应的 \(a\) 初始为空,然后考虑按照值 \(v\) 从大到小考虑每个区间 \([l, r]\),将这个区间内非空的位置全部赋值为 \(v\),如果没有非空的位置,则无解;最后为空的位置赋值为 \(1\);容易发现,这是一组单射。
于是一个 \(a\) 是合法的,可以通过子问题划分:
-
设 \(a\) 中第一个值为 \(1\) 的位置为 \(k\),即 \(a_k = 1\);此时所有跨过 \(k\) 的区间的 \(\min\) 都为 \(1\),暂时不需要管。
-
然后考虑左边 \([1, k)\) 的部分,容易发现必须满足 \([1, k)\) 中的所有区间恰好完美覆盖了 \([1, k)\),因为如果没有完美覆盖,最后存在空位被赋值为 \(1\) 就矛盾了;然后这边的值必须在 \([2, c]\) 范围内。
-
对于右边依然可以填任意的 \([1, c]\),没有限制。
于是一个 \(a\) 是否合法可以找里面第一个最小值位置然后划分到左右是否合法。
那么可以想到 dp 的状态,即 \(dp_{i, l, r}\) 表示 \(a\) 的区间 \([l, r]\) 填 \([i, c]\) 范围内的数的合法序列数,然后设一个辅助数组 \(f_{l, r}\) 表示 \([l, r]\) 是否被 \([l, r]\) 内的区间完美覆盖,那么可以得到转移:
- 若区间内没有 \(i\):
- 否则枚举区间内出现的第一个 \(i\):
这样做是 \(O(cn^3)\) 的,考虑优化;发现 \(c\) 很大,又不容易从状态里去掉,于是可以猜测 \(f_{i, l, r}\) 是关于 \(i\) 的一个多项式。
你手摸一下式子 \(f_{i, l, l} = c - i + 1\) 是一次的,于是可以归纳得到 \(f_{i, l, r}\) 是关于 \(i\) 的不高于 \(r - l + 1\) 次函数。
于是只需要算出最大的 \(n + 1\) 个 \(i\) 的 \(f_{i, 1, n}\),然后拉格朗日插值即可。
时间复杂度为 \(O(n^4)\)。
P4451 [国家集训队] 整数的lqp拆分
给定 \(n\),求:
\(1 \le n \le 10^{10000}.\)
考虑生成函数,容易发现斐波那契数列的生成函数是:
将 \(n\) 拆分为 \(i\) 个数时,答案是 \(F(x)^i\),本题是任意拆分,于是:
我们要求的是 \([x^n]ans(x) = ans_n\),列通项,求特征根方程,可以得到答案为:
直接做即可,时间复杂度为 \(O(\log n)\)。
P4609 [FJOI2016] 建筑师
给定 \(n\),求有多少个长度为 \(n\) 的排列满足前缀最大值有 \(A\) 个,后缀最大只有 \(B\) 个。
首先,先找到全局最大值 \(n\) 的位置,那么问题相当于 \(n\) 前面有 \(A - 1\) 个前缀最大值,\(n\) 后面有 \(B - 1\) 个后缀最大值,就划分成两个问题了。
那么考虑,对于长度为 \(n\) 的有 \(A\) 个前缀最大值的排列数怎么算?你发现,一个前缀最大值后面会跟一堆比它小的,然后是下一个前缀最大值;于是问题可以看作将 \(n\) 分为 \(A\) 个集合,每个集合钦定最大值放最前面,后面的可以乱排,方案数是 \((|S| - 1)!\),然后排列由集合最大值从小到大拼起来的。
你会发现这就是第一类斯特林树的定义,于是方案数是 \({n \brack A}\);于是回到原原题,相当于前面 \(A - 1\) 个集合,后面 \(B - 1\) 个集合,然后选 \(A - 1\) 个放在前面,其它按照最小值放后面,方案数是 \({n - 1 \brack A - 1 + B - 1} \binom{A - 1 + B - 1}{A - 1}\)。
直接预处理即可,时间复杂度为 \(O(nA + A^2)\)。
斯特林反演
一般形式和二项式定理完全相同,只需要将二项式系数替换为斯特林系数即可,具体的:
证明考虑反转公式:
考虑普通幂和上升幂与斯特林数的关系:
同时你发现 \(x^{\underline{n}} = (-1)^n (-x)^{\overline{n}}\),那么带入 \(-x\) 到上面的式子:
于是得到普通幂转上升幂以及类似的下降幂转普通幂:
通过这个我们可以得到反转公式的证明,例如上面可以互相带,即我先普通幂转上升幂然后再将里面的上升幂转普通幂,即:
两边对比一下系数只有 \(m = n\) 的时候系数才是 \(1\),那么可以得到恒等式:
同理,也可以先下降幂转普通幂之后普通幂再转下降幂可以得到另一个反转公式。
于是考虑证明斯特林反演:
另外一个代入类似证明。
同理,也有另外的形式:
P10591 BZOJ4671 异或图
考虑容斥一波,定义 \(f_i\) 表示最终恰好有 \(i\) 个连通块的方案数,再定义钦定图中有 \(i\) 个连通块的方案数(即块内任意连,可以不是一个连通块,但是块间没有边),那么显然有:
斯特林反演后有:
我们要算 \(f_1\),那么只需要算 \(g\) 即可。
注意到 \(n \le 10\),考虑枚举连通块的划分,是 \(\operatorname{Bell}(n)\) 级别,比较小;现在问题相当于钦定了一些连通块,然后需要选一些图把不需要的边异或掉,问解的个数。
令 \(E\) 为我们不需要的边,对于每个图 \(G_i\) 算出 \(G_i \cap E\) 后,看作若干个二进制数,于是相当于选择若干个数异或起来是全 \(0\) 的方案数;显然可以建线性基,那么设线性基大小是 \(siz\),那么方案数显然是 \(2^{s - siz}\),即其它可以任意选,然后用基底去调整成 \(0\)。
最后答案是:
时间复杂度为 \(O(\operatorname{Bell}(n) s n^2)\),可以通过。
后面还有一堆 AGC 的题,暂时咕咕咕。
不咕咕了,放这里:

浙公网安备 33010602011771号