计数相关

容斥原理:

一般化定义:

设全集 \(U\) 中有的元素有 \(n\) 种属性,第 \(i\) 种属性为 \(P_i\) ,拥有 \(P_i\) 属性的元素构成集合 \(S_i\)

\[\left |\bigcup_{i=0}^{n} S_i \right | =\sum_{m=1}^{n}(-1)^{m-1}\sum_{e_i<e_i+1}\left|\bigcap^{m}S_{e_i} \right| \]

证明:

简单使用二项式定理计算系数,对于任意一个元素我们设它出现在 \(K\) 个集合中,如果它想出现在 \(m\) 个集合的交集中则有 \({K\choose m}\) 中情况,那它被计算的次数 \(Cnt=\sum_{i=1}^{K}{K\choose i}(-1)^{i-1}=1-\sum_{i=0}^{K}{K\choose i}(-1)^i=1-(1-1)^K=1\)

对于补集的容斥:

容斥原理是求集合并集大小,如果我们要求交集大小呢。集合的交集等于全集减去 补集的并集 ,即:

\[\left| \bigcap_{i=1}^{n}S_i \right|=\left|U \right|-\left|\bigcup_{i=1}^{n}\overline{S_i} \right| \]

容斥原理的简单应用:

不定方程非负整数解计数:

给出不定方程 \(\sum_{i=1}^{n}x_i=m\) 和每一个 \(x_i\) 的取值范围 \(l_i,r_i\)\(x_i\)为非负整数,求解的数量。

对于下界我们可以在初始时直接减去相当于下界为 \(0\) ,那我们只剩下了一个上界。我们考虑建立容斥模型,设每个满足元素取值范围集合为 \(S_i\) ,我们相当于要求 \(\left| \bigcap_{i=1}^{n}S_i \right|\),直接使用补集容斥,那问题有转化为求若干个 \(\overline{S_i}\) 的交集大小,那我们又可以将下界减去,然后插板法计数即可。

I. [HAOI2008] 硬币购物

共有 \(4\) 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)

某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\)\(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。

\(s\le 1e5,n\le 1e5\)

如果没有个数的限制,那直接预处理一个完全背包就好了。现在有了硬币个数的限制,我们考虑容斥掉不合法的方案,钦定有几种硬币至少选满,其他随便选,乘上相应的容斥系数,这样就可以 \(2^4\) 回答询问。

组合计数:

一些基础的符号:
排列数:\(A_n^{m}\)
组合数:$\binom{n}{m}=C_n^{m}= \frac{n!}{m!(n-m)!} $
组合数性质:

  1. \[\binom{n}{m}=\binom{n}{n-m} \]

相当于对每一个选出的集合取补集

  1. \[\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1} \]

从组合意义来看,从n个数中选出m个,讨论是否选第n个,若不选有\(C_{n-1}^{m}\)种,若选有\(C_{n-1}^{m-1}\)种,相加即可

  1. \({n \choose m}=\frac{n}{m}{n-1\choose m-1}\)

证明比较显然,这个式子被称为吸收公式。

它的一些常用推论 \(m{n\choose m}=n{n-1\choose m-1}\)\((n-m){n\choose m}=n{n-1\choose m}\)

  1. \[\sum_{i=0}^{n}\binom{n}{i}=2^n \]

\((1+1)^n\) 的二项式定理展开形式

  1. \[\sum_{i=0}^{n}\binom{i}{k}=\binom{n+1}{k+1} \]

还是从组合意义来看,我们前边每一组从\(n\) 个数中选出 \(k\) 个数的方案,设最靠后的数的位置为 \(p\),则一共被统计了 \(n-p+1\) 次,那我们可以看做从后边的 \(n-p+1\) 个数中再选出来一个,那也就得出了后边的式子\({n+1 \choose k+1}\)

  1. \[\binom{n}{k}\binom{k}{r}=\binom{n}{r}\binom{n-r}{k-r} \]

\(n\) 个数中选出 \(k\) 个,再从 \(k\) 个数中选出 \(r\) 个,也可以看做从 \(n\) 个数中先选 \(r\) 个,再从剩下的 \(n-r\) 个中选\(k-r\) 个,也可以从代数角度证明。

\({n \choose k}{k \choose r}=\frac{n!k!}{k!(n-k)!r!(k-r)!}=\frac{n!(n-r)!}{r!(n-r)!(n-k)!(k-r)!}=\frac{n!}{r!(n-r)!} \frac{(n-r)!}{(n-k)!(k-r)!}={n \choose r}{n-r \choose k-r}\)

  1. \[\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1} \]

我们采用数学归纳法,当 \(n=1\)\(\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1}=1\)
\(n=2\)\(\sum_{i=0}^{n}\binom{n-i}{i}=F_{n+1}=2\)
对于 \(n\ge 2\) ,由\(F_{n+1}=F_{n}+F_{n-1}\)可得,我们证明\(\sum_{i=0}^{n}\binom{n-i}{i}=\sum_{i=0}^{n-1}\binom{n-1-i}{i}+\sum_{i=0}^{n-2}\binom{n-2-i}{i}\)即可
右边\(=\sum_{i=0}^{n-1}\binom{n-1-i}{i}+\sum_{i=1}^{n-2}\binom{n-1-i}{i-1}+1\)
\(=\sum_{i=1}^{n-2}[\binom{n-1-i}{i}+\binom{n-1-i}{i-1}]+1\)
\(=\sum_{i=1}^{n-2}\binom{n-i}{i}+1\)
\(=\sum_{i=0}^{n}\binom{n-i}{i}\)

  1. \[\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k} \]

从组合意义来看即可,这个东西也叫做范德蒙德恒等式,可以以这个式子为基础,衍生出一些推论

  1. \(\sum_{i=0}^{n}i{n \choose i}=n2^{n-1}\)

吸收公式的的应用, \(\sum_{i=0}^{n}i\frac{n!}{i!(n-i)!}=\sum_{i=0}^{n}n\frac{(n-1)!}{(i-1)!(n-i)!}=n\sum_{i=0}^{n}{n-1\choose i-1}=n2^{n-1}\)

  1. \(\sum_{i=0}^{n}i^2{n \choose i}=n(n+1)2^{n-2}\)

和上面同理,运用吸收公式,直接跳过前几步,\(n\sum_{i=0}^{n} i{n-1 \choose i-1}=n(\sum_{i=0}^{n-1}i{n-1 \choose i}+\sum_{i=0}^{n-1}{n-1 \choose i})\)

中间那一项套用公式 \(9\)\(n((n-1)2^{n-2}+2^{n-1})=n(n+1)2^{n-2}\)

  1. \[\sum_{i=0}^{n}\binom{i}{k}(i+1)=(k+1)\binom{n+2}{k+2} \]

我们把前边式子拆开\(\binom{i}{k}(i+1)=\frac{i!}{(i-k)!k!}*(i+1)=\frac{(i+1)!}{(i-k)!k!}\) 我们考虑再凑一个组合数出来,\(\frac{(i+1)!}{(i-k)!k!}=(k+1)\frac{(i+1)!}{(i-k)!(k+1)!}=(k+1)\binom{i+1}{k+1}\) 再套用性质四的结论即可。

  1. \(\sum_{k=0}^{n}{r+k \choose k}={r+n+1\choose n}\)

杨辉三角斜向求和式,从 \((r,0)\) 开始向右下数 \(n\) 个数之和,等于结尾位置下方的数。

证明考虑 \({r \choose 0}\)\({r+1 \choose 0}\) 相等,然后逐项利用加法公式合并即可。

补充:

\[\gcd({n-1\choose k-1},{n \choose k+1},{n+1 \choose k})=\gcd({n+1\choose k+1},{n\choose k-1},{n-1\choose k}) \]

\[\sum_{k}{a+b \choose a+k}{b+c\choose b+k}{c+a\choose c+k}(-1)^k=\frac{(a+b+c)!}{a!b!c!} \]

我们上文用到的二项式系数,都是在非负整数的定义域内。

实际上我们我们可以通过下降幂将上指标拓展到实数域,下指标拓展到整数域的,即,

\[{r \choose k}= \left\{\begin{matrix} \frac{r^{\underline{k}}}{k!}, k\ge 0 \\ 0 ,k<0 \end{matrix}\right. \]

虽然这样失去了很多组合意义,但其在数学意义上有很大作用。

下面我们来观察一下负数意义下的二项式系数表。

通过观察我们可以发现,\(r\) 为负数时,我们有另类的加法公式 \({r \choose k}={r+1\choose k} -{r\choose k-1}\)

证明也很简单,将下降幂拆开即可。

接下来我们考虑上指标为正,和为负,之间是否存在转化关系。我们就发现了 上指标反转 公式。

\[{r\choose k}=(-1)^k{k-r-1 \choose k} \]

证明,当 \(k\ge 0\) 时我们有,下降幂的上指标反转公式。

\[\begin{aligned} r^{\underline{k}}&=r(r-1)(r-2)⋅⋅⋅(r-k+1)\\ &=(-1)^{k}(-r)(-r+1)(-r+2)⋅⋅⋅(-r+k-1)\\ &=(-1)^k(k-r-1)^{\underline{k}} \end{aligned} \]

有了这个式子我们就可以轻松证明上面的公式了。

根据上面的式子我们有推论

\[(-1)^n{-m-1\choose n}=(-1)^m{-n-1\choose m} \]

例题:

I. P7322 「PMOI-4」排列变换

简要题意:给定常数 \(k\)。对于一个长度为 \(n\)排列 \(a\),定义$$f(a)={\max_{1 \le i \le k} {a_i},\max_{2 \le i \le k+1} {a_i},\cdots,\max_{n-k+1 \le i \le n} {a_i}}$$
对于一个长度为 \(n\)序列 \(a\),定义其权值 \(w(a)\)\(a\) 中不同的数的个数。对于所有长度为 \(n\) 的排列 \(p\),它们的 \(w(f(p))\) 之和。

\(n\le 1e6\),加强版 \(n\leq 1e9\)

解法较多,这里介绍一种直接计算的方法。
对于题目要求的答案,每一个数所产生的贡献是互不影响的,我们分开计算,\(f\) 序列长度为 \((n-k+1)\)\(i\) 出现在其中一个位置就要伴随着 \(k-1\) 个比 \(i\) 小的数,那此时的方案数即为 \((n-k+1)*\binom{i-1}{k-1}*k!\)。由于重复出现只记一次,我们计算在 \(f\) 序列中\(i\) 第一次时的方案,

II.BZOJ4361 isn

给出一个长度为 \(n\) 的序列 \(a_1,a_2,\dots a_n\)。如果序列 \(a\) 不是非降的,你必须从中删去一个数。

这一操作将被不断执行,直到 \(A\) 非降为止。求有多少种不同的操作方案。操作方案不同当且仅当删除的顺序或次数不同。答案对 \(10^9+7\) 取模。

\(n \le 1000\)

很神的计算方法,我们先来考虑一个弱化版,当 \(A\) 变为非降后我们可以选择是否继续进行操作,这样我们可以直接进行DP ,设 \(f_{i,j}\) 表示最终剩下以 \(i\) 结尾长度为 \(j\) 的不同非降序列数,转移是平凡的,可以用树桩数组优化到 \(n^2\log n\) , 设 \(g_i\) 表示最终剩下长度为 \(i\) 的不同非降序列数,那最终的答案为 \(\sum_{i=1}^{n} g_i*(n-i)!\) ,这样我们就解决弱化版问题。原问题增加了一个 A变为非降就终止 的限制,然后通过惊人的思考发现,对于任意一个非降序列,如果它不是终止点,那它长度加 \(1\) 的上一个序列一定也非降,长度为 \(i\) 的非降序列都对应着 \(i\) 个长度为\(i-1\) 的非降序列。那原问题的答案即为 \(\sum_{i=1}^{n} g_i*(n-i)!-g_{i+1}*(n-i-1)!*(i+1)\)

III.[Problem B: 二色莲花蝶](Problem B: 二色莲花蝶 (butterfly))

多组询问 $ n,k $,求 \(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}(i+k)(j+k)\)

\(T\le 10^5 , n,k\le 10^{18}\)

给出一种最暴力的拆式子方式 ,先把后面乘法拆开,\((ij+ik+jk+k^2)\) ,然后逐项化简。

这里先解决两个式子后面会用到。

\[F(n)=\sum_{i=0}^{n} 2^i i,G(n)=\sum_{i=0}^{n}2^i i^2 \]

对于这种相邻两项有关的式子我们可以考虑列项相减。

\(2*F(n)-F(n)=2^{n+1}n-\sum_{i=1}^{n}2^i\)

\(F(n)=2^{n+1}(n-1)+2\)

\(2*H(n)-H(n)=2^{n+1}n^2-2\sum_{i=1}^{n}2^ii+\sum_{i=1}^{n}2^i\)

\(H(n)=2^{n+1}(n^2-2n+3)-6\)

接下来对于拆出来的四项分别化简。

\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}k^2=\sum_{i=0}^{n}2^ik^2=(2^{n+1}-1)k^2\)

\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}ik=\sum_{i=0}^{n}2^iik=F(n)*k\)

\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}ij=\sum_{i=0}^{n}2^{i-1}i^2=\frac{G(n)}{2}\)

\(\sum_{i=0}^{n}\sum_{j=0}^{i}{i \choose j}jk=\sum_{i=0}^{n}2^{i-1}ik=\frac{F(n)}{2}k\)

每一项都是可以 \(O(\log n)\) 快速幂计算的,逐项算即可。

IV. AT_agc001_e [AGC001E] BBQ Hard

给出 \(n\) 个数对 \((a_i,b_i)\) ,求出 \(\sum_{i=1}^{n}\sum_{j=i+1}^{n}{a_i+b_i+a_j+b_j\choose a_i+a_j}\),答案对 \(1e9+7\) 取模。

\(n\le 2e5, a_i,b_i\le 2000\)

小巧思,这个数据范围肯定要在值域做些想法,我们有一个经典组合数式子,在网格图中从 \((0,0)\) 走到 \((n,m)\) 的方案数为 \({n+m \choose n}\) ,我们发现和本题的式子长得很像相当于从 \((-a_i,-b_i)\)\((a_j,b_j)\) 的方案数。那原式就变成了多起点多终点的路径方案问题,可以用用一遍 \(2000\times 2000\)\(dp\) 来解决,注意直接写会算上 \((-a_i,-b_i)\)\((a_i,b_i)\) 的贡献,最后特殊减一下即可。

Ⅴ. CF660E Different Subsets For All Tuples

你有一个长度为 \(n\) 的序列,每个位置上的数字值在 \([1,m]\) 范围内,求出每种可能的序列的本质不同子序列个数之和(包含空序列),答案对 \(1e9+7\) 取模。

\(n\le 10^6\)

一开始写了一种枚举序列长度的方法,发现是一个分治 \(FFT\) 的形式。绷

考虑一种简单的做法,我们枚举本质不同子序列的长度 \(i\) ,长度为 \(i\) 的子序列一共有 \(m^i\) 种,我们可以把它们视为一种,考虑把它填到长度为 \(n\) 的序列中。为了不算重,我们钦定子序列上一个数的位置到当前数的位置之前,没有出现过当前数,也就是只有 \((m-1)\) 种可填的数。

此时,最后一个数后边的位置没有限制,那我们再枚举最后一个数填的位置 \(j\) 。选出位置的方案 为 \({j-1\choose i-1}\) ,有 \(m^i\) 种子序列,前 \(j\) 个位置中没有钦定的位置的方案数为 \((m-1)^{j-i}\) ,后面位置随便填 \(m^{n-j}\) 。整理一下式子可得。

\[\sum_{i=1}^{n}\sum_{j=i}^{n}{j-1\choose i-1}m^i(m-1)^{j-i}m^{n-j} \]

又有二项式系数又有 \(i\) 次幂,看起来就很可以二项式定理,交换求和符号化简一下即可。

【UNR #2】梦中的题面

给定参数 \(b,c\) ,求满足以下条件的 \(m\) 元组 \((x_1,x_2,x_3…x_m)\) 的方案数。

  1. \(0\le x_i\le b^i-c,x\in\mathbb{Z}\)
  2. \(x_1+x_2+…+x_m< n\)

答案对 \(998244353\) 取模。

$1\le m\le 50,0\le n\le b^{m+1},2\le b\le 10^9,-b+2 \le c\le b-1 $

先把 \(n\) 减一,变成求 \(x_1+x_2+…+x_m\le n\) ,不考虑值域的限制就直接进行插板法即可,这里取值是 \(\le n\) 所以方案为 \({n+m\choose m}\) ,有了值域的限制,最暴力的是直接 \(2^m\) 容斥做,即

\[\sum_{S\subseteq\{1,2,3…m\}}(-1)^{|S|}{n+m-\sum_{i\in S}(b^i-c+1)\choose m} \]

我们把 \(|S|\) 相同的拎出来一起计算

\[\begin{aligned} \sum_{S\subseteq\{1,2,3…m\},|S|=k}(-1)^{k}{n+m+k*(c-1)-\sum_{i\in S}b^i\choose m}\\ =\frac{1}{m!}\sum_{S\subseteq\{1,2,3…m\},|S|=k}(-1)^{k}(A-\sum_{i\in S}b^i)^{\underline{m}} \end{aligned} \]

对于一个 \(k\) 来说 \(A\) 是一个定值。对于 \((A-\sum_{i\in S}b^i)^{\underline{m}}\) 这一项有很多种拆法,有一种前置较少的拆法是直接将其视为关于 \(\sum_{i\in S}b^i\)\(m\) 次多项式,也就是 \(\sum_{j=0}^{m}a_k (\sum_{i\in S}b^i)^j\),式子就变成了两部分。

先求出第 \(k\) 项的系数 \(a_k\) ,我们设递推式 \(g_{i,j}\) 表示 \((A-x)^{\underline{i-1}}\)\([x^j]\) 系数,递推式即为

\[g_{i,j}=A*g_{i-1,j}-g_{i-1,j-1} \]

接下来考虑如何求出对于每个 \(j\) 求出 \(\sum_{|S|=k}(\sum_{i\in S}b^i)^j\) ,依旧考虑递推,设 \(f_{i,j,k}\) 表示所有 \(S\subseteq \{1,2…i\}\)\(|S|=j\)\((\sum_{i\in S}b^i)^k\) 的和,根据二项式定理我们有递推式

\[\begin{aligned} f_{i,j,k}+&=f_{i-1,j,k}\\ f_{i,j,k}+&=\sum_{l=0}^{k}{k\choose l}f_{i-1,j-1,l}(b^i)^{k-l} \end{aligned} \]

分别代表是否选 \(b^i\) 这个数。但其实还有一个问题,我们在组合数转下降幂时,没有考虑范围的限制,

\({A-\sum_{i\in S}b^i\choose m}\) 可以化成 \(\frac{(A-\sum_{i \in S} b^i)^{\underline{m}}}{m!}\) 的前提是满足 \(A-\sum_{i\in S} b^i\ge 0\) ,所以我们不能直接简单递推,加上值域的限制后,如果我们将 \(A\) 视为一个 \(b\) 进制数,确定每个 \(b^i\) 取或不取的限制相当于一个数位 \(dp\) 的过程,我们直接从高位向低位考虑逐位确定,给 \(f\) 加一维 \(0/1\) 代表是否顶上界即可。对每一个 \(k\) 都要求一遍 \(f,g\) ,总的时间复杂度即为 \(O(m^5)\)

二项式定理

\[(a+b)^n=\sum_{i=0}^{n}\binom{n}{i}a^{n-i}b^i \]

\(a=1,b=-1\)\((1-1)^n=\sum_{i=0}^{n}\binom{n}{i}(-1)^i\) 在一些反演证明中应用较为广泛

二项式反演

形式一:$$f(n)=\sum_{i=0}^{n}\binom{n}{i}g(i)\Longrightarrow g(n)=\sum_{i=0}^{n} (-1)^{n-i}\binom{n}{i}f(i) $$

证明:

\[\begin{aligned} g(n)&=\sum_{i=0}^{n}(-1)^{n-i}{n\choose i}f(i)\\ &=\sum_{i=0}^{n}(-1)^{n-i}{n\choose i}\sum_{j=0}^{i}{i\choose j}g(i)\\ &=\sum_{i=0}^{n}g(i)\sum_{j=i}^{n}(-1)^{n-j}{n\choose j}{j\choose i}\\ &=\sum_{i=0}^{n}g(i){n\choose i}\sum_{j=i}^{n}(-1)^{n-j}{n-i\choose j-i}\\ &=\sum_{i=0}^{n}g(i){n\choose i}\sum_{j=0}^{n-i}(-1)^j{n-i\choose j}\\ &=g(n) \end{aligned} \]

形式二:$$f(n)=\sum_{i=n}^{m}\binom{i}{n}g(i)\Longrightarrow g(n)=\sum_{i=n}^{m} (-1)^{i-n}\binom{i}{n}f(i) $$

证明:

\[\begin{aligned} g(n)&=\sum_{i=n}^{m}(-1)^{i-n}{i\choose n}f(i)\\ &=\sum_{i=n}^{m}(-1)^{i-n}{i\choose n}\sum_{j=i}^{m}{j\choose i}g(j)\\ &=\sum_{i=n}^{m}g(i)\sum_{j=n}^{i}(-1)^{j-n}{j\choose n}{i\choose j} \end{aligned} \]

有些题目中会要求求出恰好 \(k\) 个满足限制的方案数,但是我们发现恰好的限制不好满足,就可以转化成求至少或至多的限制来做,然后套用二项式反演求出恰好。

对于形式 \(1\)\(f\) 相当于钦定了 至多 ,对于形式 \(2\)\(f\) 相当于钦定了 至少

[P4859 已经没有什么好害怕的了](P4859 已经没有什么好害怕的了 - 洛谷)

给定两个长度为 \(n\) 数组 \(a,b\) ,保证 \(a,b\) 元素互不相同。

\(a,b\) 数组元素两两配对的方案,使得在 \(n\) 对中 \(a\)\(b\) 大的恰好有 \(k\) 对。对于 \(1-n\) 的每一个 \(k\) 求出答案。\(n\le2000\)

恰好显然不好做,考虑二项式反演,如何求至少 \(k\) 个对 \(a>b\) ,跟大小有关,我们可以先将原数组排序,这样方便计数。然后考虑 \(dp\)

对于从小到大排完序的每个 \(a_i\) 可以配对的是 \(b\) 数组的一个前缀,且右端点单调右移,也就是说从小到大考虑 \(a_i\) ,只要我们知道了前边匹配了多少对,我们就可以知道现在还有多少个 \(b\) 可以与当前 \(a_i\) 配对,设 \(f_{i,j}\) 表示 \(a\) 数组前 \(i\) 个数中配对了 \(j\) 个的方案数。直接 \(dp\) 就好了,对于没有钦定的直接排列一下即可,最后别忘了反演出答案。

P6478 [NOI Online #2 提高组] 游戏

你有一棵包含 \(2n\) 个节点以 \(1\) 为根的树,其中 \(n\) 个为白点,另外 \(n\) 个为黑点。

进行 \(n\) 轮游戏,每轮游戏选出黑白点各 \(1\) 个,若这两个点存在父子关系则为非平局,求恰好有 \(k\) 轮游戏非平局的配对方案,注意这里不同方案指 配对关系 不同,并不关心顺序。对于 \(0-n-1\) 的每一个 \(k\) 求出答案。

\(n\le 5000\)

依旧是先反演一步转化成求至少,考虑树形 \(dp\)\(f_{i,j}\) 表示 \(i\) 的子树中钦定了 \(j\) 轮非平局的方案数,先用一个树上背包把子树答案合并起来,然后再判断当前点是否要选,只需要处理出子树中有多少个白点,黑点,我们知道当前钦定了多少对,那就知道了有多少点可以与当前点配对,就可以转移了,最后反演回去即可。

P11292 【MX-S6-T4】「KDOI-11」彩灯晚会

给定一张 \(n\) 个节点 \(m\) 条边的有向无环图,你可以选择将每个点染成 \(k\) 种颜色的的任意一种,一共有 \(k^n\) 种不同染色方案。

还给定了一个正整数 \(l\) ,对于一个方案,第 \(i\) 种颜色长度为 \(l\) 的链的数量 \(cnt_i\) ,则一个方案的美丽度 \(\sum_{i=1}^{k}cnt_i^2\)

求出所有 \(k^n\) 种方案的美丽度之和。答案对 \(998244353\) 取模。

\(n\le 300 ,l\le 20\)

这个 \(cnt_i^2\) 的形式看起来只能先算 \(cnt_i\) 再平方,我们考虑用组合意义转化。

\(cnt_i^2\) 相当于选出两条颜色为 \(i\) 长度为 \(l\) 的的链的方案数,这 \(k\) 种颜色本质上没有什么区别,我们算出钦定一种再乘 \(k\) 即可。

考虑计数,最暴力的方法是我们枚举两条长度为 \(l\) 的链,钦定这两条链的颜色相同,其他的节点颜色可以任选。我们发现在这个过程中,最关键的是两条链重和了多少个节点,设两条链重合了 \(x\) 个点,贡献系数即为 \(k^{n-2l+x+1}\)

我们现在的问题转化为求在图上选出两条长为 \(l\) 的链恰好重合了 \(x\) 个点的方案数。看到恰好 \(x\) 个,我们可以直接套一个二项式反演,转变成求钦定 \(x\) 个重合。

考虑在拓扑序上 \(dp\) 计数,设 \(dp_{x,u,l1,l2}\) 表示已经钦定了 \(x\) 个点重合,最后一个重合点为 \(u\) ,第一条链长度为 \(l1\) ,第二条链长度为 \(l2\) 的方案数。转移过程考虑枚举下一个重合点 \(v\) ,我们预处理出来 \(d_{u,v,len}\) 表示从 \(u\)\(v\) 长度为 \(len\) 的不同路径数,转移式即为 \(dp_{x+1,v,l1+len1,l2+len2}+=dp_{x,u,l1,l2}*d_{u,v,len1}*d_{u,v,len2}\) ,同时为了初始化,和处理最后的散段,要预处理出 \(s_{u,i},t_{u,i}\) 表示以它为起点、终点的长度为 \(i\) 的路径数,预处理的时间复杂度为 \(O(n^3l)\) 。直接暴力转移是 \(O(n^2l^5)\) 的,显然太慢了。考虑优化,首先我们同时枚举 \(len1,len2\) 转移是没有意义的,可以分步转移做到 \(O(n^2l^4)\) ,还是不够快。我们考虑到二项式反演的式子中有组合数,并且最后的贡献系数中还有 \(k^{n-2l+x+1}\) ,那是不是可以用二项式定理合并到一起呢。设 \(g\) 表示钦定,\(f\) 表示恰好。

\[\begin{aligned} f(x)&=\sum_{i=x}^{l}(-1)^{i-x}{i\choose x}k^{n-2l+x+1}g(i)\\ Ans&=\sum_{x=0}^{l}f(x)\\ &=\sum_{x=0}^{l}\sum_{i=x}^{l}(-1)^{i-x}{i\choose x}k^{n-2l+x+1}g(i)\\ &=k^{n-2l+1}\sum_{i=0}^{l}g(i)\sum_{x=0}^{i}(-1)^{i-x}{i\choose x}k^{x}\\ &=k^{n-2l+1}\sum_{i=0}^{l}g(i)(k-1)^i \end{aligned} \]

有了这个式子我们就没有必要记录第一维,重和了多少点了,直接每转移一步就乘一个 \((k-1)\) 的系数就好了。

搭配上分步转移,时间复杂度为 \(O(n^2l^3+n^3l)\) ,究极卡常,可以用邻接表存图会快一些。

P8863 「KDOI-03」构造数组

你现在有一个长度为 \(n\) 的数组 \(a\)。一开始,所有 \(a_i\) 均为 \(0\)。给出一个同样长度为 \(n\) 的目标数组 \(b\)。求有多少种方案,使得通过若干次以下操作,可以让 \(a\) 数组变成 \(b\)

  • 选出两个不同的下标 \(1\leq i<j\leq n\),并将 \(a_i\)\(a_j\) 同时增加 \(1\)

两种方案被称之为不同的,当且仅当存在一个 \(x\) 使得一种方案中第 \(x\) 次操作选择的两个下标 \((i,j)\) 与另一种方案中的不同。

答案对 \(998244353\) 取模。

\(1\le n\le5~000\)\(1\leq b_i\le30~000\)\(\sum b_i\le30~000\)

第一类斯特林数

  • \(s(n,m)\) 表示将 \(n\) 个元素分成 \(m\) 个轮换的方案数
  • 也可记作 \({n\brack m}\)
递推式:

\({n\brack m}={n-1\brack m-1}+(n-1){n-1\brack m}\)

表示可以自己单独拿出来成为一个轮换,或者插到任意一个数前面

结论一: $$ n!=\sum_{i=0}^{n} {n\brack i} $$

证明:显然一个排列唯一对应一个置换,一个置换唯一对应一个轮换。

结论二:

\[x^{\underline{n}}=\sum_{i=0}^{n}{n\brack i}(-1)^{n-i}x^i \]

证明:利用数学归纳法和递推式,\(n=1\) 时显然成立,

\[\begin{aligned} x^{\underline{n+1}}&=(x-n)*x^{\underline{n}} \\ &=x*x^{\underline{n}}-n*x^{\underline{n}} \\ &=\sum_{i=0}^{n}{n \brack i}(-1)^{n-i}x^{i+1}-n*\sum_{i=0}^{n}{n \brack i}(-1)^{n-i}x^i \\ &=\sum_{i=1}^{n+1}{n \brack i-1}(-1)^{n-i-1}x^i-n*\sum_{i=1}^{n+1}{n \brack i}(-1)^{n-i}x^i \\ &=\sum_{i=1}^{n+1}({n \brack i-1}+n{n \brack i})(-1)^{n-i-1}x^i \\ &=\sum_{i=0}^{n+1}{n+1 \brack i}(-1)^{n+1-i}x^i \end{aligned} \]

同理我们可得

\[x^{\overline{n}}=\sum_{i=0}^{n}{n \brack i}x^i \]

求一行斯特林数

第二类斯特林数

  • \(S(n,m)\)表示把\(n\) 个元素划分为 \(m\) 个子集的方案数
  • 记作\({n \brace m}\)
递推式:

\({n \brace m}={n-1 \brace m-1}+m{n-1 \brace m}\)

  • 可以看做新开一个集合或者放到之前任意一个集合中

结论一:

\[x^n=\sum_{i=0}^{n}{n \brace i}x^{\underline{i}} \]

证明:依旧考虑数学归纳法

\[\begin{aligned} x^{n+1}&=x*x^{n} \\ &=x*\sum_{i=0}^{n}{n \brace i}x^{\underline{i}} \\ &=\sum_{i=0}^{n}{n \brace i}(x^{\underline{i+1}}+i*x^{\underline{i}}) \\ &=\sum_{i=0}^{n}{n \brace i}x^{\underline{i+1}}+\sum_{i=0}^{n}{n \brace i}i*x^{\underline{i}} \\ &=\sum_{i=1}^{n+1}{n \brace i-1}x^{\underline{i}}+\sum_{i=1}^{n+1}{n \brace i}i*x \\ &=\sum_{i=1}^{n+1}({n \brace i-1}+i*{n \brace i})x^{\underline{i}} \\ &=\sum_{i=0}^{n+1}{n+1 \brace i}x^{\underline{i}} \end{aligned} \]

\[n^m=\sum_{i=0}^{m}{m\brace i}{n\choose i}i! \]

一种组合意义的证明,把前边的式子可以理解为把 \(m\) 个不同的球放入 \(n\) 个不同的盒子中,右边的式子可以理解为先钦定有球的盒子个数再计数,两者等价。

由此我们也可知 $${n \choose i}i!=n^{\underline{i}}$$

结论二:

\[m!{n \brace m}=\sum_{i=0}^{m}{m \choose i}i^n(-1)^{m-i} \]

证法一:继续归纳

\[\begin{aligned} {n \brace m}&={n-1 \brace m-1}+m{n-1 \brace m} \\ &=\sum_{i=0}^{m-1} \frac{ {m-1 \choose i}i^{n-1}(-1)^{m-1-i}}{(m-1)!}+m \sum_{i=0}^{m}\frac{{m\choose i}i^{n-1}*(-1)^{m-i}}{m!}\\ &=\sum_{i=0}^{m} \frac{ {m-1 \choose i}i^{n-1}(-1)^{m-1-i}}{(m-1)!}+ \sum_{i=0}^{m}\frac{{m\choose i}i^{n-1}*(-1)^{m-i}}{(m-1)!} \\ &= \sum_{i=0}^{m}\frac{{m\choose i}i^{n-1}*(-1)^{m-i}}{(m-1)!}-\sum_{i=0}^{m} \frac{ {m-1 \choose i}i^{n-1}(-1)^{m-i}}{(m-1)!}\\ &= \sum_{i=0}^{m}\frac{{m-1\choose i-1}i^{n-1}*(-1)^{m-i}}{(m-1)!}\\ &= \sum_{i=0}^{m}\frac{(m-1)!i^{n-1}*(-1)^{m-i}}{(i-1)!(m-i)!(m-1)!}\\ &= \sum_{i=0}^{m}\frac{m!i^n*(-1)^{m-i}}{i!(m-i)!m!}\\ &= \sum_{i=0}^{m}\frac{{m\choose i}i^n(-1)^{m-i}}{m!} \end{aligned} \]

证法二:

直接由结论一的第二个式子二项式反演可得

斯特林反演:

前置:

\[x^{\underline{n}}=(-1)^n(-x)^{\overline{n}},x^{\overline{n}}=(-1)^n(-x)^{\underline{n}} \]

翻转公式:

\[\sum_{k=m}^{n}(-1)^{n-k}{n\brack k}{k\brace m}=[m==n] \]

\[\sum_{k=m}^{n}(-1)^{n-k}{n\brace k}{k\brack m}=[m==n] \]

证明:

首先我们有

\[\begin{aligned} n^m&=\sum_{k=0}^{m}{m\brace k}n^{\underline{k}}\\ &=\sum_{k=0}^{m}{m\brace k}(-1)^k(-n)^{\overline{k}} \end{aligned} \]

代入第一类斯特林数的结论二

\[\begin{aligned} n^m&=\sum_{k=0}^{m}{m\brace k}(-1)^k\sum_{i=0}^{k}{k\brack i}(-n)^i\\ &=\sum_{i=0}^{m}n^i\sum_{k=i}^{m}(-1)^{k-i}{m\brace k}{k\brack i} \end{aligned} \]

只有 \(i=m\) 时后边系数为 \(1\) 否则为零

另外一个式子同理代入可得

反演公式:

\[\begin{aligned} f(n)=\sum_{i=0}^{n}{n\brace i}g(i)⟹g(n)=\sum_{i=0}^{n}(-1)^{n-i}{n\brack i}f(i)\\ f(n)=\sum_{i=0}^{n}{n\brack i}g(i)⟹g(n)=\sum_{i=0}^{n}(-1)^{n-i}{n\brace i}f(i) \end{aligned} \]

格路计数

一类比较有趣的组合问题,很多问题都可以转化为格路计数的变式。

我们规定在二维平面直角坐标系中,横纵坐标均为整数的点为格点,格路为从一个个点走到另一个格点的路径,格路长度为其步数。

下文我们只讨论只存在右行和上行步的情况。

最简单的问题,从 \((0,0)\)\((n,m)\) 的不同格路数有 \({n+m\choose n}\) 条。

卡特兰数

这是一种与格路计数紧密相关的数列,卡特兰数的一种定义为,从 \((0,0)\) 走到 \((n,n)\) 且不越过直线 \(y=x\) 的方案数。

有递推式 \(H_n=\sum_{i=1}^{n} H_{i-1}H_{n-i}\)

含义:枚举第一次与直线 \(y=x\) 相交的位置 \(i\) ,在 \((i,i)\) 第一次与 \(y=x\) 相交的方案数为 \(H_{i-1}\) ,后面不越过 \(y=x\) 的方案数为 \(H_{n-i}\)

卡特兰数的一种通项公式为 \(H_n={2n \choose n}-{2n \choose n-1}\)

这里就用到的一种容斥方法,反射容斥 。我们发现越过 \(y=x\) 的格路一定与 \(y=x-1\) 相交。我们取最靠后的交点,将其以后的路径全部沿 \(y=x-1\) 翻折,此时所有翻着后的路径,与从 \((0,0)\) 到点 \((n+1,n-1)\) 的路径一一对应,也就是所有从 \((0,0)\)\((n,n)\) 的不合法路径与之一一对应。相减取补集即为答案。

1

卡特兰三角

卡特兰数的进一步推广,定义 \(H(n,k)\) 表示从 \((0,0)\) 走到 \((k,n)\) 且不越过直线 \(y=x\) 的格路数量,(由 \(n\)\(1\)\(k\)\(-1\) 构成的序列,前缀和序列都不小于零)。

  1. \(H(n,0)=1,n\ge 0\)
  2. \(H(n,1)=n,n\ge 1\)
  3. \(H(n,k)=H(n,k-1)+H(n-1,k),2\le k \le n\)
  4. \(H(n,n)=H(n,n-1),n\ge 2\)
  5. \(H(n,k)=\sum_{i=0}^{k}H(n-1,i)\)
  6. \(H(n,k)={n+k \choose k}-{n+k\choose k-1}=\frac{n+1}{n-k+1} {n+k \choose k}\)
  7. \(H(n,k)=\sum_{i=0}^{k}H(n-1,i)=\sum_{i=k}^{n}H(i,k-1)\)

证明:

公式 \(7\) 可以直接由定义理解。

对于公式 \(6\) 来说,我们延续上面的反射容斥即可证明,其余式子将 \(6\) 带入即可证明。

一般化

定义 \(H_m(n,k)\) 表示,从 \((0,0)\) 走到 \((k,n)\) 不越过直线 \(y=x-m+1\) 的格路数。

和上面唯一不同的是通项 \(H_m(n,k)={n+k \choose k}-{n+k\choose k-m}\) ,依旧是利用反射容斥。

双线反射容斥

求从 \((0,0)\) 走到 \((n,m)\) ,且不触碰 \(y=x+l\)\(y=x+r\)\((l<0<r)\) 的格路数量。

我们用 \('L'\) 表示与 \(y=x+l\) 相交,用 \('R'\) 表示与 \(y=x+r\) 相交。连续多次相交同一条直线视为一次相交,设 \(f(S)\) 表示顺次处理 \(S\) 中的对称得到的答案,设 \(x,y\) 为经过对称后的起点 ,\(f(S)={n-x+m-y\choose n-x}\)

下面需要一个并不是很显然的多步容斥。

\(Ans=f(∅)-f(L)-f(R)+f(LR)+f(RL)-f(LRL)-f(RLR)...\)

证明:

我们考虑对于一个串 \(LRLRL\) 被计算了多少次 ,由于反射容斥每次钦定的是第一个相交的位置,所以会在以 \(L\) 开头和以 \(R\) 开头时分别计算到以它开始的每一个前缀,对于例子来说 \(L,LR,LRL,LRLR,LRLRL\) 的系数分别为 \(-1,1,-1,1,-1\)\(R,RL,RLR,RLRL\) 系数为 \(-1,1,-1,1\) ,两组相加结果一定为 \(-1\) ,在加上空集的贡献,总贡献为 \(0\)

通过手玩对称过程,我们发现原式可以化简为

\(Ans=\sum_{k\in Z} {n+m \choose n-k(r-l)}-{n+m \choose n-k(r-l)+r}\)

直接计算时间复杂度为 \(O(\frac{n+m}{r-l})\)

[P3266 [JLOI2015] 骗我呢]([P3266 JLOI2015] 骗我呢 - 洛谷)

一个 \(n*m\) 的数组,要求满足 \(x_{i,j}<x_{i,j+1},x_{i,j}<x_{i-1,j+1}\),且 \(0 \le x_{i,j} \le m\)

求合法的填数方案,\(n,m\le 1e6\),答案对 \(1e9+7\) 取模。

容易发现,一共有 \(m+1\) 种数,每一行要填单调递增的 \(m\) 个,那关键的也就是谁被删去了。

手玩发现,若第 \(i\) 行被删去的为 \(x\) ,则第 \(i-1\) 行被删去的只能是 \([0,x+1]\) ,这样我们就可以写出转移式$$f_{i,0}=f_{i-1,0}+f_{i-1,1},f_{i,j}=f_{i,j-1}+f_{i-1,j+1}$$

由于最终答案是一个求和的形式,我们直接给转移加上一行,最终答案就是 \(f_{n+1,m}\)

我们发现转移式和前边很相似,但是有 \(f_{i-1,j+1}\) 这一项,我们把第 \(i\) 行向右平移 \(i\) 个单位长度,这样就可以把 \(j+1\) 扔掉,同时我们需要在前面补上一个点来维护 \(0\) 的转移。这时候就跟我们格路计数的式子一模一样了。我们把它放到平面直角坐标系中来看(第一行纵坐标为 \(0\) )。

1

绿色的代表我们维护 \(0\) 的转移而增加的边。从实际含义上来看,对于第 \(i-1\) 行我们从第 \(j\) 个位置上移到下一行,代表我们原数组中第 \(i\) 行删去了 \(j-i\) 。同时有含义可知,路径不经过 \(y=x+1\)\(y=x-m-2\) 这两条直线(值域要求)。那直接套用双射线反射容斥即可。

[Problem B: 阴暗扭曲的爬行](Problem B: 阴暗扭曲的爬行)

你有一个无限长的数轴,初始你在 \(0\) 处。接下来 \(2n\) 秒内,每秒你可以可以选择向左或向右移动一个单位长度,如果到达了 \(n\) 处则立即结束,求有多少种到达 \(n\) 出的移动方案。\(n\le 1e6\)

向左、向右可以分别对应向上、向右,到达 \(n\) 处也就代表在到达 \(y=x-n\) 这条线。由于到达之后立即停止,那最后一步一定是向右的,那我们把这条直线向左平移一个单位长度。

那原题就转化为用不超过 \(2n\) 步到达直线 \(y=x-m+1\) 上的,且不经过直线 \(y=x-m\) ,直接枚举到哪个点,反射容斥即可。

posted @ 2025-09-05 11:25  shanganze  阅读(68)  评论(0)    收藏  举报