Re : 从 [ 数据删除 ] 开始的计数

Re : 从 [ 数据删除 ] 开始的 生成函数 计数 | The Count That Refuses to Start at 0

项目编号: [数据删除]

项目等级: Euclid

保密等级: 本档案仅限持有至少初中数学水平权限的人员查阅。任何试图从0开始阅读本文档的行为将被记录并上报。

[警告] 阅读本档案所需至少初中知识,并附加上以下内容:

组合计数,一点点高数(极限部分),一点点高中数学(函数、数列)

[警告] 阅读过程中请时刻注意自己的理智值 Sanity,应大于 1D60

前言

要上一周数学,台下学生悲痛欲绝:

数学[o(╥﹏╥)o]↓,数学[o(╥﹏╥)o]↓……

(呃↑,数学是谁…阿巴阿巴…嘻嘻(⊙_⊙)?

千言万语汇成一句:

组合意义天地灭,代数推导保平安

大多数时候从组合意义思考是会很困难的,但是可以生成函数或者其它代数方法硬导,但是导出来的公式自己也不知道组合意义

杂项

建议学习路径

flowchart TD A["前置知识<br>微积分 + 组合恒等式"] A --> B["OGF 常规生成函数"] B --> C["EGF 指数生成函数"] B --> D["容斥原理"] C --> D D --> E["二项式反演"] D --> F["Min-Max 容斥"] D --> G["格路径 & 反射容斥"] E --> H["Tricks"] F --> H G --> H H --> I["实践题"] I --> J["OI 实战"] A --> 0["公式表"] 0 --> J

标签索引

题目标签汇总

题目 标签
ARC110D Binomial Coefficient is Fun 范德蒙德卷积、组合数、生成函数
CF785D Anton and School - 2 组合数
CF1332E Height All the Same 二项式定理、组合数
LOJ6160 二分图染色 容斥、递推、生成函数、二分图
LOJ6244 七选五 容斥、错排
P1450 硬币购物 DP、容斥、背包
P4099 SAO 容斥、树上背包
ABC173F Intervals on Tree 点-边容斥、平面图欧拉公式

按标签频次统计

标签 出现次数
容斥 5(LOJ6160, LOJ6244, P1450, P4099, ABC173F)
组合数 2(ARC110D, CF785D, CF1332E)
生成函数 2(ARC110D, LOJ6160)
递推 1(LOJ6160)
二分图 1(LOJ6160)
错排 1(LOJ6244)
DP / 背包 1(P1450)
树上背包 1(P4099)
点-边容斥 / 平面图欧拉公式 1(ABC173F)
二项式定理 1(CF1332E)

公式表

标号 公式 名称 位置
\(\text{Abs.I}\) \(m\dbinom{n}{m} = n\dbinom{n-1}{m-1}\) 吸收恒等式 基础知识->组合数学
\(\text{Pr.I}\) \(\dbinom{n}{r}\dbinom{r}{k} = \dbinom{n}{k}\dbinom{n-k}{r-k}\) 链式法则 基础知识->组合数学
\(\text{Pas.I}\) \(\dbinom{n}{m} = \dbinom{n-1}{m}+\dbinom{n-1}{m-1}\) 帕斯卡恒等式 基础知识->组合数学
\(\text{Van.C 1}\) \(\sum_{i=0}^{k}\dbinom{n}{i}\dbinom{m}{k-i} = \dbinom{n+m}{k}\) 范德蒙德卷积 基础知识->组合数学
\(\text{Van.C 2}\) \(\sum_{i=0}^{n}\dbinom{i}{s}\dbinom{n-i}{t} = \dbinom{n+1}{s+t+1}\) 范德蒙德卷积(变体)
\(\text{NtB.Thm}\) \((a+b)^n = \sum_{i=0}^{n}\dbinom{n}{i}a^ib^{n-i}\) 牛顿二项式定理 基础知识->组合数学
\(\text{BV.Thm 0}\) \(f(x) = \sum_{i=0}^{n}(-1)^{i}\binom{x}{i}g(i) \iff g(x) = \sum_{i=0}^{n}\binom{x}{i}f(i)\) 二项式反演-基础形式 容斥->二项式反演->基础形式
\(\text{BV.St.Thm 1}\) \(f(x) = \sum_{i=x}^{n} \binom{i}{x} g(i) \iff g(x) = \sum_{i=x}^{n} (-1)^{i-x} \binom{i}{x}f(i)\) 二项式反演-钦定-至少 \(\iff\) 恰好 容斥->二项式反演->钦定意义下
\(\text{BV.St.Thm 2}\) \(f(x) = \sum_{i=0}^{x}\binom{n-x}{n-i}g(i) \iff g(x) = \sum_{i=0}^{x} (-1)^{x-i} \binom{n-i}{n-x}f(i)\) 二项式反演-钦定-至多 \(\iff\) 恰好 容斥->二项式反演->钦定意义下
\(\text{BV.Ch.Thm 1}\) \(f(x) = \sum_{i=x}^{n}\binom{n-x}{n-i}g(i) \iff g(x) = \sum_{i=x}^{n}(-1)^{i-x}\binom{n-x}{n-i}f(i)\) 二项式反演-选择-至少 \(\iff\) 恰好 容斥->二项式反演->选择意义下
\(\text{BV.Ch.Thm 2}\) \(f(x) = \sum_{i=0}^{x}\binom{x}{i}g(i) \iff g(x) = \sum_{i=0}^{x}(-1)^{x-i}\binom{x}{i}f(i)\) 二项式反演-选择-至多 \(\iff\) 恰好 容斥->二项式反演->选择意义下
\(\text{LPE.Fml 0}\) \(\dbinom{x_2+y_2-x_1-y_1}{x_2-x_2}\) 格路径计数基础公式 格路径计数和反射容斥
\(\text{LPE.Fml}\) \(\sum_{k\in Z} \binom{n+m}{n-k(r-l)}\binom{n+m}{n-k(r-l)+r}\) 两个限制的格路径计数 格路径计数和反射容斥->两个限制的格路径计数
\(\text{KmG.}\) \(N_{\text{valid}} = \sum_{\sigma \in G} \text{sgn}(\sigma) \cdot \binom{ (u - a) + (v - b) }{ u - \sigma(a) }\) Karlin-McGregor 公式 格路径计数和反射容斥->反射容斥

基础知识

微积分 | Calculus

好久没用的微积分在这里派上了用场

导数 | Derivative

对于函数 \(f : D \to R\),其在 \(x_0\) 存在导数,当且仅当极限

\[\lim_{\Delta x \to 0} \dfrac{f(x+\Delta x) - f(x)}{\Delta x} \tag{D.Def 1} \]

存在,其导数值为该极限的值

可以记作:

\[\frac{\text d f}{\text d x} \mid_{x=x_0}; \ f'(x_0); \ f'(x)|_{x=x_0} \]

\(f(x)\) 在其定义域内的所有点的导数构成的函数就是 \(f(x)\) 的导函数,简称导数,记作 \(\frac{\text d f}{\text d x}\) 或者 \(f'\)

微分 | Differentiation

对于函数 \(f : D \to R\),在 \(U(x_0)\) 有定义。如果函数的增量

\[\Delta y = f(x_0+\Delta x)-f(x_0) \]

可以表示为

\[\Delta y = A \cdot \Delta x + \omicron(\Delta x) \]

则称函数在此处可微,并称 \(A\Delta x\) 是函数在 \(x = x_0\) 处的微分,记作 \(\text d y\),或者 \(\text d f(x)\)

容易发现 \(A = f'(x_0)\),所以 \(\text d y |_{x=x_0} = f'(x_0)\text d x\)

所以 \(f'(x_0) = \frac{\text d y}{ \text d x}\)

积分 | Integration

不定积分 | Indefinite Integral

对于函数 \(f : D \to R\),在区间 \(I\) 上有定义,如果函数 \(F(x)\) 在区间 \(I\)

\[\dfrac{\text d F}{\text dx} = f(x) \]

恒成立,则称 \(F(x)\)\(f(x)\)原函数 Antiderivative

\(f(x)\) 的积分,定义为所有 \(F(x)\) 的集体,即:

\[\int f(x) \text d x = F(x) +C \tag{I.Def 1} \]

\(C\) 是一个与 \(x\) 无关的常数

积分是微分的逆运算


其实定积分很有用,但在这篇博客里确实用不上

组合数学

一些会用到的东西

吸收恒等式 Absorption Identity

\[m\dbinom{n}{m} = n\dbinom{n-1}{m-1} \tag{Abs.I} \]

链式法则 Chaining Identity/乘积恒等式 Product Identity

\[\dbinom{n}{r}\dbinom{r}{k} = \dbinom{n}{k}\dbinom{n-k}{r-k} \tag{Pr.I} \]

帕斯卡恒等式 Pascal's Identity

\[\dbinom{n}{m} = \dbinom{n-1}{m}+\dbinom{n-1}{m-1} \tag{Pas.I} \]

范德蒙德卷积 Vandermonde Convolution

\[\sum_{i=0}^{k}\dbinom{n}{i}\dbinom{m}{k-i} = \dbinom{n+m}{k} \tag{Van.C 1} \]

\[\sum_{i=0}^{n}\dbinom{i}{s}\dbinom{n-i}{t} = \dbinom{n+1}{s+t+1} \tag{Van.C 2} \]

杂项

\[m^2 = 2\dbinom{m}{2}+\dbinom{m}{1} \]

\[m^3 = 6\dbinom{m}{3}+6\dbinom{m}{2}+\dbinom{m}{1} \]

这个可以用来转换

牛顿二项式定理 Newton's Binomial Theorem

\[(a+b)^n = \sum_{i=0}^{n}\dbinom{n}{i}a^ib^{n-i} \tag{NtB.Thm} \]

生成函数 Generating Function

OGF | 常规生成函数

对于无限数列 \(\{a_n\}\) ,其生成函数为:

\[G(x)=\sum_{n\ge 0}a_n x^n \]

记为:

\[<a_0,a_1,a_2,\cdots,a_n,\cdots>\overset{\operatorname {OGF}}{\longrightarrow} G(x) \]

常见数列生成函数

\[<1,1,\cdots,1,\cdots> \overset{\operatorname {OGF}}{\longrightarrow} G(x) = \frac{1}{1-x} \]

\[<1,a,a^2,\cdots,a^k,\cdots>\overset{\operatorname {OGF}}{\longrightarrow} G(x) = \frac{1}{1-ax} \]

\[<\dbinom{n}{0},\ldots,\dbinom{n}{n},0,\ldots,0>\overset{\operatorname {OGF}}{\longrightarrow}(1+x)^n \]

\[\{\dbinom{n+i-1}{i-1}\} \overset{\operatorname {OGF}}{\longrightarrow} \dfrac{1}{(1-x)^n} \]

生成函数的平移与伸缩

平移

向右:乘上 \(x^k\)

\[\begin{equation} \begin{split} G(x)&=a_0+a_1x+a_2x^2+a_3x^3+\cdots\\ x^kG(x)&=a_0x^k+a_1x^{k+1}+a_2x^{k+2}+a_3x^{k+3}+\cdots \end{split} \end{equation} \]

向左:乘上 \(x^{-k}\)

\[\begin{equation} \begin{split} x^{-k}\left[G(x) - \sum_{i=0}^{k}a_ix^i \right]=a_k+a_{k+1}x+a_{k+2}x^2+a_{k+3}x^3+\cdots \end{split} \end{equation} \]

如果加入 \(\vartheta\) 算子(\(\vartheta f = xf'\)

就有神奇的事发生:

\[\vartheta G(x) = xG'(x) = a_1x+2a_2x^2+3a_3x^3+\cdots = \sum_{i\ge0}ia_ix^i \]


伸缩

\[G(x^k) = a_0+a_1x^k+a_2x^{2k}+a_3x^{3k}+\cdots \]

单位根反演

单位根:满足 \(\omega^k=1\)复数 \(\omega\)

\[\left[k \mid n\right] = \frac{1}{k}\sum_{i=0}^{k-1}\omega_{k}^{ni} \]

有:

(记 \(\omega = e^{\frac{2\pi i}{k}}\)

\[\begin{equation} \begin{split} \sum_{i\ge0}[k|i]a_ix^i &= \sum_{i\ge0}\frac1ka_ix^i\sum_{j=0}^{k-1}\omega^{ij}\\ &=\frac1k \sum_{j=0}^{k-1}\sum_{i\ge 0}a_ix^i\omega^{ij}\\ &=\frac1k\sum_{j=0}^{k-1}G(\omega^j x) \end{split} \end{equation} \]

前缀和

对于 \(F(x) = \sum\limits_{n}f_nx^n\)

\[\dfrac{1}{1-x}F(x) = \sum_{n}(\sum_{i\le n}f_i)x^n \]

卷积

\[(F\cdot G)(x)=\sum_{n}(\sum_{a+b=n}f_ag_b)x^n \]

EGF | 指数生成函数

标准形式

\[<a_0,a_1,a_2,\cdots,a_k,\cdots>\overset{\operatorname{EGF}}{\longrightarrow} \sum_{n\ge0}\frac{a_n}{n!}x^n \]

常见数列生成函数

\[<1,1,1,\cdots,1,\cdots>\overset{\operatorname{EGF}}{\longrightarrow} e^x \]

容斥 Inclusion Exclusion Principle

容斥坏的一批的我来学容斥了

基础 Standard

定义 Definition

对于全集 \(U\) 中的元素,有 \(n\) 种不同的属性,第 \(i\) 种属性为 \(P_i\),拥有属性 \(P_i\) 的元素构成集合 \(S_i\),则有:

\[\left|\bigcup_{i=1}^{n}S_i\right| = \sum_{m=1}^{n}(-1)^{m-1}\sum_{a_i<a_{i+1}}\left|\bigcap_{i}S_{a_i}\right| \]

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

一般化

对于函数 \(f : A \to R\)\(g : A \to R\),其中 \(A\) 是集合簇,若

\[f(S) = \sum_{T\subseteq S}g(T) \]

\[g(S) = \sum_{T \subseteq S}(-1)^{|S|-|T|} f(T) \]

反演 Inversion

容斥也是一种反演

定义 Definition

假设函数 \(f(n)\) 满足:

\[f(n) = \sum_{i=0}^na_{n,i} g(i) \]

如果存在序列 \(b_{n,n}\) 满足:

\[g(n) = \sum_{i=0}^{n}b_{n,i}f(i) \]

这就是反演操作,即使用两个序列表示两个函数的相关性

第一反演公式

如果存在 \(n\) 次多项式 \(p,q\) 满足以下公式:

\[[x^n]p = \sum_{i=1}^{n}c_{n,i} [x^i]q\\ [x^n]q = \sum_{i=1}^{n}d_{n,i} [x^i]p \]

则对于任意序列,都满足:

\[u_n = \sum_{i=1}^{n} c_{n,i}v_i \iff v_n = \sum_{i=1}^{n} d_{n,i}u_i \]

由这个定理我们可以知道反演的条件是什么

我们定义 \(\mathbf C\)\(\mathbf D\) 表示 \(c_{n,i}\)\(d_{n,i}\) 的下三角矩阵,将 \(p\)\(q\) 写成列向量 \(\mathbf p\)\(\mathbf q\)

所以 \(\mathbf p = \mathbf C \mathbf q\)\(\mathbf q = \mathbf C \mathbf p\),这个时候:\(\mathbf p = \mathbf C \mathbf D \mathbf p\)

这就说明 \(\mathbf C \mathbf D = \mathbf I\),也就是说 \(\mathbf C\)\(\mathbf D\) 互为逆矩阵

由于它们是下三角矩阵,所以逆存在的条件是(以 \(\mathbf C\) 举例):

\[\det \mathbf C = \prod_{i=1}^{n} c_{i,i} \not= 0 \]

也就是 \(c_{i,i}\) 不等于 \(0\)

二项式反演 Binomial Inversion

二项式反演 Binomial Inversion,其作用是将 [至少]/[至多] 类问题 和 [恰好]类问题 进行转化

基础形式 Standard

\[f(x) = \sum_{i=0}^{n}(-1)^{i}\binom{x}{i}g(i) \iff g(x) = \sum_{i=0}^{n}\binom{x}{i}f(i) \tag{BV.Thm 0} \]

将右边代入左边易证,这个方法对于后面的形式都适用


在实际问题中,[至少]/[至多]类问题 在不同意义下并不相同

就像钦定意义下,[至少]/[至多] 已经确定了至少的部分(至多可以通过钦定补集的至少确定)

在选择意义下,则不管是什么,就是传统意义的至少至多

这也就导致了钦定意义下会发生重复计数


在下文中,\(g(x)\) 都表示 [恰好] 的计数,相应的,\(f(x)\) 就表示在 钦定/选择意义下的 [至少]/[至多]计数

钦定意义下 Under the stipulated sense

[至少]

\[f(x) = \sum_{i=x}^{n} \binom{i}{x} g(i) \iff g(x) = \sum_{i=x}^{n} (-1)^{i-x} \binom{i}{x}f(i) \tag{BV.St.Thm 1} \]

[至多]

\[f(x) = \sum_{i=0}^{x}\binom{n-x}{n-i}g(i) \iff g(x) = \sum_{i=0}^{x} (-1)^{x-i} \binom{n-i}{n-x}f(i) \tag{BV.St.Thm 2} \]

选择意义下 Under the meaning of choice

[至少]

\[f(x) = \sum_{i=x}^{n}\binom{n-x}{n-i}g(i) \iff g(x) = \sum_{i=x}^{n}(-1)^{i-x}\binom{n-x}{n-i}f(i) \tag{BV.Ch.Thm 1} \]

[至多]

\[f(x) = \sum_{i=0}^{x}\binom{x}{i}g(i) \iff g(x) = \sum_{i=0}^{x}(-1)^{x-i}\binom{x}{i}f(i) \tag{BV.Ch.Thm 2} \]

Min-Max 容斥

对于全序集 \(S\),其中元素满足可加减性

\[\min S = \sum_{T\subseteq S\land T\not=\varnothing} (-1)^{|T|-1}\max T\\ \max S = \sum_{T\subseteq S\land T\not=\varnothing} (-1)^{|T|-1}\min T \]

扩展形式:

\[\operatorname{kth}\max S = \sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min T\\ \operatorname{kth}\min S = \sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-k}\binom{|T|-1}{k-1}\max T \]

这么看有点没用,但是它对于期望也是成立的

\[\mathbb E[\min S] = \sum_{T\subseteq S\land T\not=\varnothing} (-1)^{|T|-1}\mathbb E[\max T]\\ \mathbb E[\max S] = \sum_{T\subseteq S\land T\not=\varnothing} (-1)^{|T|-1}\mathbb E[\min T] \]

\[\mathbb E[\operatorname{kth}\max S] = \sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-k}\binom{|T|-1}{k-1}\mathbb E[\min T]\\ \mathbb E[\operatorname{kth}\min S] = \sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-k}\binom{|T|-1}{k-1}\mathbb E[\max T] \]

集合划分容斥

在某种等价关系下,对于某一组合结构,构成其的元素其可以被划分成若干等价类,有一关于等价类大小的系数 \(F(x)\),记等价类之间的合并关系为 \(G(x)\),集合划分容斥找到容斥系数 \(H(x)\) 使得:

\[G(H(x)) = F(x) \]

格路径计数和反射容斥 Lattice path enumeration & André Reflection principle

\((x_1,y_1)\)\((x_2,y_2)\) 只能够向右/上走的方案数是:

\[\binom{x_2+y_2-x_1-y_1}{x_2-x_1} \tag{LPE.Fml 0} \]

Catalan 数 | Catalan Number | Catalan Sequence

定义 Definition

Catalan 数列是序列

\[\left\{ C_n \right\}_{n=0}^{\infin} \]

其中 \(C_0 = 1\)

\[C_n = \frac{1}{n+1}\dbinom{2n}{n}, \forall n \ge 1 \]

有以下递推式

\[C_n = \sum_{i=0}^{n-1}C_iC_{n-i-1} \]

\[C_n = \frac{4n-2}{n+1}C_{n-1} \]


考虑由 \(n\)\(+ 1\)\(n\)\(-1\) 构成的 \(2n\) 项序列

\[\left\{a_i\right\}_{i=0}^{2n} \]

其部分和满足 (式壹)

\[\sum_{i=1}^{k} a_i \ge 0 \> (k = 1,2,\ldots,2n) \]

序列的个数等于第 \(n\) 个 Catalan 数

\[C_n = \frac{1}{n+1}\dbinom{2n}{n} \]

考虑证明

证明方法是反射容斥

因为直接证明太过复杂,所以考虑正难则反

\(2n\) 个位置上选 \(n\) 个,方案数就是 \(\dbinom{2n}{n}\)

记满足 式壹 的序列为可接受的 Acceptable,不满足的为不可接受的 Unacceptable

记可接受的数量为 \(\{A_n\}_{n=0}^{\infin}\) ,不可接受的即为 \(\{U_n\}_{n=0}^{\infin}\)

因此

\[A_n + U_n = \dbinom{2n}{n} \]

所以我们考虑第一个是的部分和为负数的 \(k\),即

\[\sum_{i=1}^{k} a_i = -1 \]

因为是第一个,所以一定有 \(\sum\limits_{i=1}^{k-1}a_i = 0\),则 \(a_k = -1\)

不失一般性,假设 \(k\) 是奇数,对 \(a_i,\forall i \le k\) 取反 \(a_i = -a_i\)

得到新序列 \(\{a_i’\}_{i=0}^{2n}\) ,此时,有 \(n+1\)\(1\)\(n - 1\)\(-1\),这就说明了我们建立了两种关系的双射

所以有 \(U_n\) 等于在 \(n +1\)\(1\)\(n-1\)\(-1\)的排列数

\[U_n = \dbinom{n}{n+1 \ \ n-1} = \frac{n!}{(n+1)!(n-1)!} \]

所以有

\[\text{answer}_n = A_n = \dbinom{2n}{n} - U_n = \dbinom{2n}{n} - \dbinom{2n}{n+1} \]

稍微化简

\[\text{answer}_n = \frac{1}{n+1}\dbinom{2n}{n} = C_n \]

考虑一般情况,有 \(n\)\(1\)\(m\)\(-1\),不妨假设 \(n\ge m\)

则终点为 \((m,n)\) 的下三角格路径数有

\[\text{answer}_{nm} = \dbinom{n+m}{n}-\dbinom{n+m}{n+1} \]

不妨展开

\[\begin{equation} \begin{split} \text{Ans}_{nm} &= \dbinom{n+m}{n} - \dbinom{n+m}{n+1}\\ &= \frac{(n+m)!}{n!m!} - \frac{(n+m)!}{(n+1)!(m-1)!}\\ &= \frac{(n+m)!}{n!(m-1)!}(\frac{1}{m} - \frac{1}{n+1})\\ &= \frac{(n+m)!}{n!(m-1)!} \cdot \frac{n-m+1}{m(n+1)}\\ &= \frac{n-m+1}{n+1}\dbinom{n+m}{n} \end{split} \end{equation} \]

这就是拓展的 Catalan 数

稍微转化一下:

\((0,0)\) 开始走,终点为 \((n,m)\) ,只能向右、向上走,不能超越 \(y = x+1\) 的方案数

将第一次触碰 \(y = x+1\) 的点后的路径翻折(蓝色),就容易得到不合法的路径的终点 \((m-1,n+1)\)

生成函数

\[\left\{C_n\right\}_{n=0}^{\infin} \overset{\operatorname{OGF}}{\longrightarrow} \frac{1-\sqrt{1-4x}}{2x} \]

\(G(x) = \sum_{n\ge 0} C_nx^n\)

由第一种递推关系则有

\[xG^2(x) = G(x) - 1 \]

解出来就是上式了

两个限制的格路径计数

\((0,0)\) 开始走,终点为 \((n,m)\) ,只能向右、向上走,不能触碰 \(y = x+l\)\(y = x+r\) 的方案数

考虑将触碰/超越 \(y=x+l\)/\(y=x+r\) 记作 L/R

对于一段连续的 L/R ,只用记录单个的 L/R

容易发现:恰好为 LRLR... 的路径数很难求

所以考虑求至少为 LRLR... 的路径数

所以最后的答案就是:

\[\sum_{k\in Z} \binom{n+m}{n-k(r-l)}\binom{n+m}{n-k(r-l)+r} \tag{LPE.Fml 1} \]

HVD 格路径

允许走对角的格路径

现在我们仅考虑下三角 HVD 格路径的方案数,不妨记 \(S(n,m:rD)\) 表示到 \((m,n)\) 且有 \(r\) 个对角线的下三角 HVD 路径数

我们可以将 \(r\) 个对角线拆成 \(r\) 个上和右

易知这个问题等价于

\[\sum_{i=0}^{n+m-r+1}x_i = n \]

的非负整数解个数

\[\begin{equation} \begin{split} S(n,m:rD) &= \frac{n-m+1}{n+1} \dbinom{n+1}{r} \dbinom{n+m-r}{n}\\ &= \frac{n-m+1}{n+1}\frac{(n+1)!(n+m-r)!}{r!\,(n+1-r)!n!\,(m-r)!} \end{split} \end{equation} \]

\[\begin{equation} \begin{split} S(n, m) &= \sum_{r=0}^{n}S(n,m:rD)\\ &= \sum_{r=0}^{n}\frac{n-m+1}{n+1}\frac{(n+1)!(n+m-r)!}{r!\,(n+1-r)!n!\,(m-r)!} \end{split} \end{equation} \]

反射容斥

由于原来的问题涉及到斜线段,所以考虑坐标变化,也就是对于 \((x, y)\),记 \(u = x+y,v = x-y\),转化成 \((u,v)\)

所以向右/上的移动转化成了 \((1,\pm 1)\)

这里给出公式:

\[N_{\text{valid}} = \sum_{\sigma \in G} \text{sgn}(\sigma) \cdot \binom{ (u - a) + (v - b) }{ u - \sigma(a) } \tag{KmG.} \]

其中,\((a,b)\) 是起点坐标,\((u,v)\) 是终点坐标,\(\text{sgn}\) 表示置换 \(\sigma\) 的符号,\(\sigma\) 表示镜像后的置换

这个公式就是 Karlin-McGregor 公式,也就是 LGV 引理 的特殊情况

Tricks

生成函数 Tricks

生成函数求解递推式

常系数齐次递推式

用来求解类似这种的递推式

\[f_n = \sum_{i=1}^{k}a_if_{n-i} \]

其中,\(a_i\)\(k\) 是与 \(n\) 无关的常数

\(F(x) = \sum\limits_{n}f_nx^n\),是 \(f_{n}\)OGF

所以有:

\[(1-\sum_{i=1}^{k}a_ix^i)F(x) = Q(x)F(x) = \sum_{i=0}^{k-1} (f_i - \sum_{j=1}^{i}a_jf_{i-j})x^i = P(x) \]

所以

\[F(x) = \frac{P(x)}{Q(x)} \]

由于 \(Q(x)\) 高阶的时候很难求,这里我们暂时考虑 \(k = 2\),也就是二阶常系数递推的情况:

\[f_n = pf_{n-1}+qf_{n-2} \]

考虑 \(f_0 = m\)\(f_i = 0,\forall i \lt 0\)

这个时候:

\[F(x) = \frac{f_0}{1-px-qx^2} \]

裂项:

\[\frac{f_0}{1-px-qx^2} = \frac{A}{1-\varphi_1x} +\frac{B}{1-\varphi_2x} \]

容易知道 \(\varphi_1\)\(\varphi_2\) 是很容易求的,就是 \(1-px-qx^2 = 0\) 的两个解:

\[\varphi_{1,2} = \frac{p\pm \sqrt{p^2+4q}}{2} \]

我们知道 \(A(1-\varphi_2x)+B(1-\varphi_2x) = f_0\)

解得:

\[\begin{cases} A = \frac{\varphi_1 f_0}{\varphi_1 - \varphi_2}\\ B = \frac{\varphi_2 f_0}{\varphi_2 - \varphi_1} \end{cases} \]

知道:

\[\begin{split} f_n &= A\varphi_1^n + B\varphi_2^n\\ &= \frac{(p+\sqrt{p^2+4q})^{n+1}-(p-\sqrt{p^2+4q})^{n+1}}{2^{n+1}\sqrt{p^2+4q}} f_0 \end{split} \]


我们可以把 \(k\) 阶常系数递推式化成对应的特征方程形式:

\[1-\sum_{i=1}^{k}a_k\lambda^i = 0 \]

对应的有 \(r\) 个根,\(r_i,i=1,2,\ldots,k\)\(m_i,i=1,2,\ldots,r\) 是根的重数,分两种情况讨论:

\(m_i = 1,\forall i\in \{1,2,\ldots,r\}\)

\[f_n = \sum_{i=1}^{r}C_i\lambda_i^n \]

\(C_i\) 是与 \(n\) 无关的常数

\(m_i\not= 1, \exist i\in \{1,2,\ldots,r\}\)

\[f_n = \sum_{i=1}^{r}\left(\sum_{j=0}^{m_i-1}C_{i,j}n^j \right)\lambda_{i}^n \]

\(C_{i,j}\) 是与 \(n\) 无关的常数

生成函数 求 递推式

在已知一个生成函数的闭形式的时候,是可以求出它对应数列的递推式的

即我们可以通过构造该生成函数的微分方程并且比对系数

具体的要看情况,大概率是求导,然后找导函数和原本函数的代数关系

实践

来几道题

现在是飞行实践时间



\(n\) 是正整数,证明:

\[\sum_{k=0}^{n}(-1)^k\dbinom{n}{k}^2 = \begin{cases} \begin{split} 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \,&n \equiv 1\mod{2} \\ (-1)^{\frac{n}{2}}\dbinom{n}{n/2},&n \equiv0 \mod 2 \end{split} \end{cases} \]

证明

\(\binom{n}{k}^2\) 并不好处理,所以考虑拆开

\[\sum_{k=0}^{n}(-1)^k\dbinom{n}{k} \cdot \dbinom{n}{k} \]

很像卷积形式,考虑到 \(\binom{n}{k} = \binom{n}{n-k}\),所以:

\[\sum_{k=0}^n (-1)^k \dbinom{n}{k}\cdot\dbinom{n}{n-k} \]

\(F(x) = \sum\limits_{k}(-1)^k\dbinom{n}{k}x^k\)\(G(x) = \sum\limits_{k}\dbinom{n}{k}x^k\)

这个时候:\((F\cdot G)(x) = \sum\limits_{k}\left(\sum_{a+b=k}(-1)^a\binom{n}{a}\binom{n}{b}\right) = F(x)G(x) = (1-x)^n \cdot (1+x)^n = (1-x^2)^n\)

所以我们所求变为 \([x^n](F\cdot G)\),显然,这个卷积只存在偶数项,所以考虑 \(n = 2m\) 的情况

\[\begin{equation} \begin{split} [x^n](F\cdot G)(x) &=[x^n] (1-x^2)^n \\ &=[x^n] \sum_{i=0}^{n}(-1)^{n-i}\dbinom{n}{i}x^{2i} \\ &=(-1)^{m}\dbinom{n}{m} \end{split} \end{equation} \]

即:\((-1)^{\frac{n}{2}}\binom{n}{n/2}\)

\(\square\)



来道简单题放松一下

\[\sum_{i=0}^{n}i\dbinom{n}{i} \]

\(\sum\limits_{i=0}^{n}\binom{n}{i} = 2^n\) 很像,所以考虑化归到这个上

观察到 \(i \cdot\) ,所以考虑 \(\vartheta\) 算子

\(F(x) = \sum\limits_{i=0}^{n} \binom{n}{i}x^i = (1+x)^n\)

\(\vartheta F(x) = \sum\limits_{i = 1}^{n}i\binom{n}{i} = nx(1+x)^{n-1}\)\(i=0\)的那一项值为 \(0\) ,可以忽略

带入 \(x = 1\),有

\[\begin{equation} \begin{split} \sum_{i=0}^{n} i\dbinom{n}{i} x^i &=n \cdot x \cdot (1+x)^{n-1}\\ &=n \times 1 \times (1+1)^{n-1}\\ &=n2^{n-1} \end{split} \end{equation} \]



\(n\)\(k\) 是正整数,证明:

\[\sum_{k=0}^{n}k\dbinom{n}{k}^2 = n\dbinom{2n-1}{n-1} \]

又有 \(\binom{n}{k}^2\),老套路,将它拆开得到 \(\sum\limits_{i=0}^{n}k\binom{n}{k} \cdot \binom{n}{n-k}\)

\(F(x) = \sum\limits_{k}k\binom{n}{k}x^k = \vartheta ((1+x)^n) = nx(1+x)^{n-1}\)\(G(x) = \sum_{k}\binom{n}{k}x^k = (1+x)^{n}\)

所以所求即为

\[\begin{equation} \begin{split} [x^n](F\cdot G)(x) &=[x^n]\left[ nx(1+x)^{n-1} \cdot (1+x)^n \right]\\ &=[x^n]nx(1+x)^{2n-1}\\ &=[x^n]\sum_{i=1}^{2n-1}n\dbinom{2n-1}{i-1}x^i\\ &=n\dbinom{2n-1}{n-1} \end{split} \end{equation} \]

即证 \(\square\)



这是道容斥题

对于集合 \(A\)\(B\),其中 \(|A|=n\)\(|B|=m\),求 \(\#\{f:A\to B \mid \forall y\in B,\exist x\in A,\text{s.t. } f(x)=y \}\),即求从 \(A\)\(B\) 的满射个数

这里给出公式:

\[\sum_{k=0}^{n}(-1)^k\dbinom{m}{k}(m-k)^{n} \]

首先,这个问题可以转化成将 \(n\) 个不同的球放进 \(m\) 个不同的盒子中的方案数

考虑钦定 \(k\) 个盒子为空,剩下的 \(m-k\) 个盒子放 \(n\) 个球,方案数 \((m-k)^n\)

容斥出来就是

\[\sum_{k=0}^{n}(-1)^{k}\dbinom{m}{k}(m-k)^n \]

根据这个转化的问题,我们可以给出这个值:

\[\begin{equation} \begin{split} \sum_{k=0}^{m} (-1)^{k}\dbinom{m}{k}(m-k)^{n} = \begin{cases} 0, &n\lt m\\ m!,&m=n\\ m!\begin{Bmatrix}m\\n\end{Bmatrix},&m\gt n \end{cases} \end{split} \end{equation} \]



这还是道容斥题

#6160. 「美团 CodeM 初赛 Round A」二分图染色

可以放 OI 题中的,我不想放

因为是纯推式子题

原问题可以转化为对于一个二分完全图,我们要找到两个匹配,使得它们覆盖点集无交的方案数

我们先考虑确定一组匹配的方案数

对于 \(n\) 个节点的完全二分图,任意确定一组匹配的方案数就是:\(\sum\limits_{i=0}^{n}\binom{n}{i}n^{\underline{i}}\),也就是 \(\sum\limits_{i=0}^{n}i!\binom{n}{i}\)(枚举选的点的个数 \(i\),将其连接到另一边,另一边也需要选 \(i\) 个点出来,一边有顺序,一边无顺序)

不妨令 \(f_n = \sum\limits_{i=0}^{n}i!\binom{n}{i}^2\)

容易发现,\(f^2_n\) 就是找到两个匹配的方案数,但是这样子会出现重叠

但稍微想一下,我们可以钦定有 \(i\) 个地方重叠,然后剩余的随便放,然后就可以容斥了

最终可以得到:

\[\sum_{i=0}^{n}(-1)^ii!\dbinom{n}{i}^2f_{n-i}^{2} \]



P3978 [TJOI2015] 概率论

这是一道生成函数题

虽然是道紫,但是是纯推式子

前置知识:Catalan 数(如果不知道可以看着我的这一篇博客 1

首先,我们容易知道,节点数为 \(n\) 的二叉树个数是第 \(n\) 个 Catalan 数(考虑左子树有 \(i\) 个节点,右子树就有 \(n-i-1\) 个节点,然后就能写出递推式)

考虑它的生成函数 \(C(x) = \sum\limits_{n}C_nx^n\),由递推式 \(C_n = \sum_{i=0}^{n-1}C_iC_{n-i-1}\) 得到:

\[C = 1 + xC^2 \]

解得

\[C(x) = \frac{1-\sqrt{1-4x}}{2x} \]

这里我们不妨令 \(a_i\) 表示节点数为 \(i\) 的二叉树的叶子节点个数之和,容易知道:(考虑左右子树的叶子结点个数)

\[a_n = 2\sum_{i=0}^{n-1}a_iC_{n-i-1} \]

考虑它的生成函数 \(A(x) = \sum\limits_{n}a_nx^n\),由递推式得:

\[A(x)-x=2xC(x)A(x) \]

解得:

\[A(x) = \frac{x}{1-2xC(x)} \]

也就是:

\[A(x) = \frac{x}{\sqrt{1-4x}} \]

所以:

\[\begin{equation} \begin{split} a_n &= [x^n]A(x)\\ &= [x^{n-1}](1-4x)^{\frac{1}{2}}\\ &= \boxed{\binom{2n-2}{n-1}} \end{split} \end{equation} \]

所以:

\[\boxed{ \mathbb{E}_{T\sim \text{Unif}(\mathcal{T}_n)}\left[\,|\{u\in V(T)\mid \text{son}(u)=0\}|\,\right] = \frac{\binom{2n-2}{n-1}}{\frac{1}{n+1}\binom{2n}{n}} = \frac{n(n+1)}{2(2n-1)} } \]

其中 \(V(T)\) 表示 \(T\) 的顶点集,满足 \(|V(T)|=n\)\(\mathcal T_n\) 表示所有大小为 \(n\) 的二叉树的集合



证明 Min-Max 容斥(不考虑拓展)

对于普通形式

这里考虑证明 \(\max\) 的情况,\(\min\) 的情况因为对称性易证

我们考虑构造映射:\(f : S \to A\),其中 \(A = \{\{1,2,3,\ldots,i\} \mid 1\le i \le |S|\}\)

假设 \(x = \operatorname{kth} \max S\),则 \(f(x) = \{1,2,3,\ldots,k\}\),这是个双射我们发现 \(f(\max\{x,y\}) = f(x) \bigcap f(y)\)\(f(\min\{x,y\}) = f(x) \bigcup f(y)\),所以:

\[\begin{split} \left|f(\max S)\right| &= \left|\bigcup_{x \in S} f(x) \right|\\ &= \sum_{T \subseteq S} (-1)^{|T|-1} \left|\bigcap_{x \in T} f(x) \right|\\ &= \sum_{T \subseteq S} (-1)^{|T|-1} \left|f(\min T) \right| \end{split} \]

\(f^{-1}\) 映射回去就行了

对于期望

我们发现:

\[\begin{split} \mathbb E[\max {S}] &= \sum_{y} \text{Pr}\{y=x \} \max S\\ &= \sum_{y} \text{Pr}\{y=x \} \sum_{T\subseteq S \land T \not = \varnothing} (-1)^{|T|-1} \min T\\ &= \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T|-1}\sum_{y}\text{Pr}\{y=x \}\min T\\ &= \sum_{T\subseteq S \land T \not= \varnothing} (-1)^{|T|-1}\mathbb E[\min T] \end{split} \]

对称性易证 \(\min\) 的情况



P4931 [MtOI2018] 情侣?给我烧了!(加强版)

考虑 \(f(n,k)\) 表示 \(n\) 排中 \(k\) 对情侣坐对的方案数,设 \(D_n\) 表示 \(n\) 对情侣全部坐乱的方案数

所以:

\[f(n,k)=\binom{n}{k}^2 D_{n-k}k! \ 2^{k} \]

所以有:

\[\sum_{k=0}^{n}f(n,k) = (2n)! = \sum_{k=0}^{n}\binom{n}{k}^2 D_{n-k} k! 2^k \]

稍微变一下型:(可以自己代一下)

\[\sum_{k=0}^{n}\frac{2^k}{k!}\cdot \frac{D_{n-k}}{[(n-k)!]^2} = \frac{(2n)!}{(n!)^2} \]

由于左侧很像卷积的形式,所以考虑令 \(D(x) = \sum\limits_{n}\frac{D_{n}}{n!^2}x^n\)

有:

\[e^{2x}D(x) = (1-4x)^{-\frac{1}{2}} \]

解出来 \(D(x) = e^{-2x}(1-4x)^{-\frac{1}{2}}\)

考虑求导求递推式:

\[D'(x) = 8x(1-4x)^{-1}D(x) \]

即:

\[(1-4x)D'(x) = 8xD(x) \]

对比系数:

\[\frac{4D_n}{n!(n-1)!}= \frac{D_{n+1}}{n!(n+1)!} - \frac{8D_{n-1}}{[(n-1)!]^2} \]

解得:

\[D_n = 4n(n-1)D_{n-1}+8n(n-1)^2D_{n-2} \]



AT_abc235_g [ABC235G] Gardens

不知道啊,生成函数直接推出来了

依旧:组合意义天地灭,代数推导保平安

考虑一个盒子的生成函数:\(F(x,y,z) = (1+z)(1+y)(1+z)-1\),每个苗都可以选一个或者说不选,但要减去全部都不选的方案

所以有:

\[\begin{split} \text{Ans} &= \sum_{a=0}^{A}\sum_{b=0}^{B}\sum_{c=0}^{C}[x^ay^bz^c]F(x,y,z)\\ &= \sum_{a=0}^{A}\sum_{b=0}^{B}\sum_{c=0}^{C}[x^ay^bz^c]\sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}(1+x)^i(1+y)^i(1+z)^i\\ &= \sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}\sum_{a=0}^{A}[x^a](1+x)^i\sum_{b=0}^{B}[y^b](1+y)^i\sum_{c=0}^{C}[z^c](1+z)^i\\ &= \sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}\sum_{a=0}^{A}\binom{i}{a}\sum_{b=0}^{B}\binom{i}{b}\sum_{c=0}^{C}\binom{i}{c} \end{split} \]

容易发现后面的式子可以递推

来几道 OI 题

AT_arc110_d [ARC110D] Binomial Coefficient is Fun

tag :[范德蒙德卷积]、[组合数]、[生成函数]

我懒得写过程了

最后求出来是这个:

\[[x^m]\dfrac{x^{\sum{i=1}^{n}A_i}}{(1-x)^{\sum_{i=1}^{n} A_i + n + 1}} \]

稍微拆开,就容易得到答案为 \(\dbinom{n+m}{m-\sum_{i=1}^{n}A_i}\)

ll C(ll n, ll k) {
	if (k < 0 || k > n) return 0;
	k = min(k, n - k);
	
	ll numerator = 1, denominator = 1;
	for (ll i = 1; i <= k; i++) {
		numerator = numerator * ((n - i + 1) % mod) % mod;
		denominator = denominator * i % mod;
	}
	return numerator * fpow(denominator, mod - 2) % mod;
}

void solve() {
    int n;
	ll m;
	cin >> n >> m;
	
	ll sum = 0;
	for (int i = 0; i < n; i++) {
		ll x;
		cin >> x;
		sum += x;
	}
	
	if (sum > m) cout << 0 << "\n";
	else cout << C(m + n, sum + n) << "\n";
}

CF785D Anton and School - 2

tag :[组合数]

考虑钦定最后一个 (

对于 \(i \text{ s.t. } \text{str}_i=\text{(}\),记 l[i] 表示其左边的 ( 个数(包含自己),r[i] 表示其右边 ) 的个数

所以其贡献为:

\[\sum_{j=0}^{\min{l_i-1, r_i-1}} \dbinom{l_i-1}{j}\dbinom{r_i}{j+1} \]

套上范德蒙德卷积得到 \(\dbinom{l_i+r_i-1}{l_i}\)

ll ans = 0;
for (int i = 1; i <= n; i++)
	if (str[i - 1] == '(')
		ans = (ans + C(l[i] + r[i + 1] - 1, l[i])) % mod; // 计算的时候 r[i] 把 i 算进去了,所以 r[i] 和 r[i +1] 其实是等价的

CF1332E Height All the Same

tag : [二项式定理]、[组合数]

稍微观察一下就会发现,整个网格中奇数的个数的奇偶性是一个不变量

分两种情况:

  • \(nm \equiv 1\mod 2\),这种不论什么情况都满足,答案是 \((r-l+1)^{nm}\)
  • \(nm\equiv 0 \mod 2\),奇数个数的奇偶性必须为偶数(即奇数个数为偶数)

现在考虑第二种

\(o\) 表示奇数个数,\(e\) 表示偶数个数

所以答案就是:

\[\sum_{i\equiv 1 \mod 2} \dbinom{nm}{i}o^ie^{nm-i} \]

很像二项式定理,所以考虑一下:

\[\begin{equation} \begin{split} (o+e)^{nm} &=\sum_{i=0}^{nm}\dbinom{nm}{i}o^ie^{nm-i}\\ &=\sum_{i\equiv0 \mod 2}^{mn} \dbinom{nm}{i}o^ie^{nm-i} + \sum_{i\equiv 1\mod 2} \dbinom{nm}{i}o^ie^{nm-i} \end{split} \end{equation} \]

在考虑一下 \((o-e)^{nm}\) (这个的奇偶分开是异号的)

\[(o-e)^{nm}=\sum_{i\equiv0 \mod 2}^{mn} \dbinom{nm}{i}o^ie^{nm-i} - \sum_{i\equiv 1\mod 2} \dbinom{nm}{i}o^ie^{nm-i} \]

所以答案就是:

\[\dfrac{(o+e)^{nm}-(o-e)^{nm}}{2} \]

cin >> n >> m >> l >> r;

ll expond = (ll)n * m;

if (expond & 1)
	cout << fpow(r - l + 1, expond) << "\n";
else {
	ll k = r - l + 1;
	ll odd = (r >> 1) - ((l - 1) >> 1);
	ll even = k - odd;
	ll ans = (fpow(k, expond) + fpow(odd - even, expond)) % mod;
	ans = ans * fpow(2, mod - 2) % mod;
	cout << ans << "\n";
}

#6160. 「美团 CodeM 初赛 Round A」二分图染色

tag [容斥]、[递推]、[生成函数]、[二分图]

式子在上面

很明显,如果使用 \(f_n\) 的通项公式的话会 TLE,考虑推递推式

打表发现有可能是个二阶递推式,其形式为:

\[f_n = a_nf_{n-1}+b_nf_{n-2} \]

这个看起来并不好求

考虑将 \(f_n\) 展开

\[f_n = \sum_{i=0}^{n}i!\dbinom{n}{i}^2 = \sum_{i=0}^{n}\frac{(n!)^2}{i!(n-i)!^2} = \sum_{i=0}^{n}\frac{(n!)^2}{(i!)^2(n-i)!} \]

构造它的指数生成函数 \(F(x) = \sum\limits_{n}f_n\frac{x^n}{n!}\)

代入:

\[\begin{equation} \begin{split} F(x) &= \sum_{n}\left(\sum_{i=0}^{n}\frac{(n!)^2}{(i!)^2(n-i)!}\right) \cdot\frac{x^n}{n!}\\ &= \sum_{n}\sum_{i=0}^{n}\frac{n!}{(i!)^2(n-i)!}x^n \end{split} \end{equation} \]

形式不好看,发现了 \((i!)^2\) 项,所以考虑分离,考虑变换求和下标

\(n = i + m\),所以

\[\begin{equation} \begin{split} F(x) &= \sum_{i}\sum_{m}\frac{(i+m)!}{(i!)^2m!}x^{i+m}\\ &= \sum_{i}\frac{x^i}{i!}\sum_{m}\frac{(i+m)!}{i!m!}x^m \end{split} \end{equation} \]

发现 \(\binom{i+m}{i} = \frac{(i+m)!}{i!m!}\),所以后面这个求和为:\(\sum\limits_{m}\binom{i+m}{i}x^m = \frac{1}{(1-x)^{i+1}}\)

所以:

\[\begin{equation} \begin{split} F(x) &= \sum_{i}\frac{x^i}{i!}\frac{1}{(1-x)^{i+1}}\\ &= \frac{1}{1-x}\sum_{i}\frac{1}{i!}\left(\frac{x}{1-x} \right)^i \end{split} \end{equation} \]

\(e^x\) 泰勒展开的经典形式

所以

\[\begin{equation} \begin{split} F(x) = \frac{1}{1-x}e^{\frac{x}{1-x}} \end{split} \end{equation} \]

所以 \(F(x)\) 的闭形式就求出来了,对等式两边求 \(\ln\)

\[\begin{equation} \begin{split} \ln F(x) = -\ln(1-x)+\frac{x}{1-x} \end{split} \end{equation} \]

关于 \(x\) 求导得:

\[\begin{equation} \begin{split} \frac{F'(x)}{F(x)} &= \frac{1}{1-x}+\frac{1}{(1-x)^2}\\ &= \frac{2-x}{(1-x)^2} \end{split} \end{equation} \]

所以有:

\[(1-x)^2F'(x) = (2-x)F(x) \]

通过比较系数,可以得到递推式

我们知道 \(F'(x) = \sum\limits_{n}f_{n+1}\frac{x^n}{n!}\)

将左边展开得

\[(x^2-2x+1)F'(x) = (2-x)F(x) \]

左边的总系数:

\[\frac{f_{n+1}}{n!} - 2n \frac{f_n}{n!} + n(n-1) \frac{f_{n-1}}{n!} \]

右边的总系数:

\[2 \frac{f_n}{n!} - n \frac{f_{n-1}}{n!} \]

比较得到:

\[f_{n+1} = 2(n+1)f_n - n^2f_{n-1} \]

也就是:

\[f_n = 2nf_{n-1}-(n-1)^2 f_{n-2} \]

这个数列在 OEIS 上已有收录,为 OEIS A002720,网址:A002720

描述为:

a(n) is also the total number of increasing subsequences of all permutations of [1..n] (see Lifschitz and Pittel).

—— N. J. A. Sloane, May 06 2012

a(n) is also the number of matchings in the complete bipartite graph K(n,n).

—— Sharon Sela (sharonsela(AT)hotmail.com), May 19 2002

a(n) is also the number of 12-avoiding signed permutations in B_n (see Simion ref).

a(n) is also the order of the symmetric inverse semigroup (monoid) I_n. - A. Umar, Sep 09 2008

……

第二句就是我们给出的定义

f[0] = 1, f[1] = 2;
for (int i = 2; i <= n; i++) 
    f[i] = (2ll * i * f[i - 1] % mod - 1ll * (i - 1) * (i - 1) % mod * f[i - 2]) % mod;

for (int i = 0; i <= n; i++) {
    ll temp = 0;
    int sign = (i & 1) ? -1 : 1;

    temp = C(n, i) * C(n, i) % mod;
    temp = temp * f[n - i] % mod * f[n - i] % mod;

    temp = temp * fact[i] % mod;

    answer = (answer + sign * temp) % mod;
}

answer = (answer + mod) % mod;

cout << answer << "\n";

不过你以为这就完了吗?

我们知道,有些棋盘问题可以转化成二分图问题,反之亦然

这道题经过转化,可以转化成在棋盘上面放车,使得它们互相不攻击

而对于 A002720 的描述中有:

a(n) is also the number of non-attacking placements of k rooks on an n × n board, summed over all k >= 0.

—— Vaclav Kotesovec, Aug 28 2012

具体的推导可以参考这篇文章:LOJ6160 美团 CodeM 初赛 Round A 二分图染色【容斥】

#6244. 七选五

tag : [容斥]、[错排]

钦定 \(x\) 个位置匹配上,剩余的位置必须不匹配

利用容斥:全部错排 = 全部乱排 - 排对一个位置其余全部乱排 + 排对两个位置其余乱排 - …

式子就是:

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

P1450 [HAOI2008] 硬币购物

tag : [动态规划]、[容斥]、[背包]

有数量限制就很难堪,因为这样复杂度很不好

所以考虑容斥将数量限制给消掉

我们就不妨随机钦定一些硬币的数量是 \(d_i+1\)

这里记完全背包算出来的答案是 \(f_n\)

则:

\[\sum_{i=0}^{4}(-1)^{i}f_{s-\sum\limits_{a_{j}\lt a_{j+1} \land |\{a\}|=i} (d_{a_j} +1) c_{a_j} } \]

\(s\) 减去的是 \(\sum\limits_{a_j\lt a_{j+1} \land |\{a\}|=i}(d_{a_j}+1)c_{a_j}\)

for (int i = 1; i <= 4; i++)
    for (int j = c[i]; j <= (int)1e5; j++)
        dp[j] += dp[j - c[i]];

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= 4; j++)
        cin >> d[j];
    int s;
    cin >> s;

    ll ans = 0;
    for (int mask = 0; mask < (1 << 4); mask++) {
        int bits = __builtin_popcount(mask);
        int sum = 0;
        for (int j = 0; j < 4; j++) 
            if (mask & (1 << j)) 
                sum += (d[j + 1] + 1) * c[j + 1];

        if (s >= sum) {
            if (!(bits & 1)) 
                ans += dp[s - sum];
            else 
                ans -= dp[s - sum];

        }
    }
    cout << ans << "\n";
}

P4099 [HEOI2013] SAO

tag : [容斥]、[树上背包]

首先,我们知道全是 < 的情况,对于节点 \(i\),其想要成为以其为根的时候的最小,概率为:

\[\operatorname{Pr}\{w_i = \min_{j\in \text{subtree}(i)} w_j\} = \frac{1}{\text{size}_i} \]

其中,\(\text{subtree}\) 表示以 \(i\) 为根的子树,\(\text{size}_i\) 表示 \(|\text{subtree}(i)|\),即以 \(i\) 为根的子树的大小

这个时候总的方案数为:

\[\frac{n!}{\prod\limits_{i = 1}^{n}\text{size}_i} \]

考虑和 Permutation 一样的做法:将 > 替换成 <?,其中 ? 可以替代 <>

所以我们考虑将 ? 的边删除,这样就形成了很多小的只包含 < 的连通块

我们不妨设 \(f_{u,i}\) 表示对于 \(\text{subtree}(u)\) ,其连通块大小为 \(i\) 时的概率

容易发现,对于 (u,v)='>' 并改成 ?\(f_{u,i} \leftarrow f_{u,i}\cdot \sum\limits_{v}\sum\limits_{j=1}^{\text{size}_v}f_{v,j}\)

对于剩下的情况:(容斥 < 的个数,系数是 \((-1)^{\text{cnt}_{\text{`<`}}}\)

\[\begin{equation} \begin{split} \begin{cases} f_{u,i+j} \leftarrow -f_{u,i} \cdot f_{v,j} \cdot \frac{i}{i+j}, &(u,v) = \text{'>'} \ \land \ (u, v) \to \text{'<'} \\ f_{u,i+j} \leftarrow f_{u,i} \cdot f_{v,j} \cdot \frac{i}{i+j}, &(u,v) = \text{'<'} \end{cases} \end{split} \end{equation} \]

第一行的 \(-\) 是因为将 > 改成了 << 的数量多了 \(1\) 对应的容斥系数要乘 \(-1\)

这就是一个树上背包,分析出来复杂度是 \(\mathcal O(n^2)\)

void DFS(int u, int father) {
	siz[u] = 1;
	dp[u][1] = 1;
	
	for (edge _ : adj[u]) {
		int v = _.to;
		if (v == father) continue;
		DFS(v, u);
		
		for (int i = 0; i <= siz[u] + siz[v]; i++) temp[i] = 0;
		
		ll sum_v = 0;
		for (int j = 1; j <= siz[v]; j++)
			sum_v = (sum_v + dp[v][j]) % mod;
		
		if (_.weight == '>') for (int i = 1; i <= siz[u]; i++)
			temp[i] = (temp[i] + dp[u][i] * sum_v) % mod;
		
		for (int i = 1; i <= siz[u]; i++)
			for (int j = 1; j <= siz[v]; j++) {
				if (_.weight == '>') {
					temp[i + j] = (temp[i + j] - dp[u][i] * dp[v][j] % mod * i % mod * inv[i + j]) % mod;
//					temp[i] = (temp[i] + dp[u][i] * sum_v % mod);
				} else
					temp[i + j] = (temp[i + j] + dp[u][i] * dp[v][j] % mod * i % mod * inv[i + j]) % mod;
			}
		
		siz[u] += siz[v];
		for (int i = 1; i <= siz[u]; i++) dp[u][i] = temp[i];
	}
	
}

最后的答案就是

\[\text{ans} = n!\sum_{i=1}^{n} f_{1,i} \]

AT_abc173_f [ABC173F] Intervals on Tree

tag : [点-边容斥](有点没看出来,但是课件这么讲的)、[平面图欧拉公式]

*update:点-边容斥其实就是利用平面图欧拉公式求出来的:\(C = |V|-|E|\),其中 \(C\) 是连通块个数

对于图 \(G\) 的导出子图 \(G' = (V',E')\),根据平面图欧拉公式:

\[C = |V'| - |E'| \]

现在考虑有多少个点

\[\begin{equation} \begin{split} |V'| &= \sum_{l=1}^{n}\sum_{r=l+1}^{n}(r-l+1)\\ &= \sum_{l=1}^{n}\sum_{\text{len} = 1}^{n-l+1}\text{len}\\ &= \sum_{l=1}^{n}\frac{(n-l+1)(n-l+2)}{2}\\ &= \sum_{l=1}^{n} \frac{l(l+1)}{2} \end{split} \end{equation} \]

有多少条边:

很明显,直接统计并不现实

所以考虑边 \((u,v)\) 对于答案的贡献:

\((u,v)\) 对于 \(l\le u \le v \le r\) 的区间都有贡献

所以:

\[\begin{equation} \begin{split} |E'| &= \sum_{(u,v) \in E} u(n - v+1) \end{split} \end{equation} \]

答案就是 \(|V'|-|E'|\)

for (int i = 1; i <= n; i++) answer += 1ll * i * (i + 1) / 2;
for (int i = 1; i < n; i++) answer -= 1ll * e[i].u * (n - e[i].v + 1);

附录 & 后记

附录 : 标签索引

题目标签汇总

题目 标签
ARC110D Binomial Coefficient is Fun 范德蒙德卷积、组合数、生成函数
CF785D Anton and School - 2 组合数
CF1332E Height All the Same 二项式定理、组合数
LOJ6160 二分图染色 容斥、递推、生成函数、二分图
LOJ6244 七选五 容斥、错排
P1450 硬币购物 DP、容斥、背包
P4099 SAO 容斥、树上背包
ABC173F Intervals on Tree 点-边容斥、平面图欧拉公式

按标签频次统计

标签 出现次数
容斥 5(LOJ6160, LOJ6244, P1450, P4099, ABC173F)
组合数 2(ARC110D, CF785D, CF1332E)
生成函数 2(ARC110D, LOJ6160)
递推 1(LOJ6160)
二分图 1(LOJ6160)
错排 1(LOJ6244)
DP / 背包 1(P1450)
树上背包 1(P4099)
点-边容斥 / 平面图欧拉公式 1(ABC173F)
二项式定理 1(CF1332E)

后记

我也没啥说的,笔者的水平也就那样,写成这样已经很不容易了

到最后统计 [103000] 字,共计 [37689] 字符

参考资料

posted @ 2026-08-21 21:36  Yangyihao  阅读(27)  评论(0)    收藏  举报