Part 1
基础组合数学
::::info[前置]
问题一:
\(n\) 个相同的小球放入 \(m\) 个不同的盒子,盒子可以为空。
方案数为 \(\binom{n+m-1}{m-1}\)。(插板法)
问题二:
\(n\) 个相同的小球放入 \(m\) 个不同的盒子,每个盒子最多放 \(k\) 个,盒子可以为空。
考虑进行简单的容斥。
考虑强行给某些盒子 \(k+1\) 个球得到不合法方案,转化为问题一来求。
答案为
其中,\(F(n,m)=\binom{n+m-1}{m-1}\)。
::::
::::success[CCPC2023 秦皇岛热身赛 ]
把赢局视为小球,输局视为隔板,由于 \(n,m\) 确定,小球总数和盒子数都是确定的。
问题转化为:\(\sum_{i=1}^{n-m+1}a_i=m\),且 \(\max\{a_i\}=k\) 的方案数。
考虑简单容斥:考虑将问题改为 \(a_i\le k\) 的方案数,即上述问题二,则用 \(ans(a_i\le k)-ans(a_i<k)\) 即可。
复杂度 \(O(n)\)。
细节:\(k=0\) 时特判。
::::
::::success[AT_agc013_e Placing Squares]
转化:
-
在非标记的位置可以放上隔板。
-
在每个分隔出的区域之间要刚好放上一黑一白两个球,可以重叠。
则所有隔板和球的放法的方案数就是答案。
第一条限制可以分割出所有的正方形边长。
第二条限制是乘法原理,对应面积。
开始 \(dp\):
记 \(f_{i,0/1/2}\) 表示目前在第 \(i\) 个位置,与上一个隔板之间已经放了 \(0/1/2\) 个球。
对于转移方程:
由于第二条限制,只有 \(f_{i,2}\) 的转移可以放隔板。
若 \(i+1\) 的左边界可以放隔板(\(i\not \in X\))。
\(f_{i,0}\):不放球。
\(f_{i,2}\):放隔板,不放球。
\(2f_{i,0}\):放黑/白球。
\(f_{i,1}\):不放球。
\(2f_{i,2}\):放隔板,放黑/白球。
\(f_{i,0}\):放两球。
\(f_{i,1}\):放剩下一球。
\(f_{i,2}\):不放隔板,不放球。
\(f_{i,2}\):放隔板,放两球。
若 \(i+1\) 的左边界不可以放隔板(\(i\in X\))。
去掉对应放隔板的项即可。
初始状态为 \(f_{1,0}=f_{1,2}=1,f_{1,1}=2\)。
答案为 \(f_{n,2}\),直接转移是 \(O(n)\) 的。
考虑矩阵快速幂。
记状态向量为 \([f_{i,0},f_{i,1},f_{i,2}]\)
对于可以放隔板的转移矩阵:
对于不可以放隔板的转移矩阵:
复杂度 \(O(m\log n)\)。
::::
::::success[P2606 [ZJOI2010] 排列计数]
发现是统计小根堆的方案数。
由于堆的形态已经确定,只用看每个位置的值。
分析一下:
堆的根一定是1,则要考虑把剩下的数往两个子树内放,可以先分出 \(n-1\) 个数哪些在左子树,哪些在右子树,方案数为 \(\large\binom{n-1}{sz_{lson}}\)。接着可以递归下去做,每次方案数为 \(\large\binom{sz_u-1}{sz_{lson}}\),递归到叶子节点结束,为了同时维护 \(sz\),考虑后序遍历。
::::
Catalan数与反射容斥
::::success[P3266 [JLOI2015] 骗我呢]
容易发现每一行只有一种数没有出现。
记 \(f_{i,j}\) 表示第 \(i\) 行 \(j\) 没有出现。把行号从 0 开始标,值域为 \([1,m+1]\)。
则 \(f_{i_j}=\sum_{k=0}^{j+1} f_{i-1,k}=f_{i,j-1}+f_{i-1,j+1}\) 。
初始状态为 \(f_{0,0}=1\),答案为 \(f_{n,m}\)。
考虑使用格路计数。
记 \(f_{i,j}\) 所在点横坐标 \(x\) 为 \(i+j\),纵坐标 \(y\) 为 \(i\)。
有 \((x,y)=(x-1,y)+(x,y-1)\)。
起点为 \((0,0)\) 终点为 \((n+m,n)\)。
由于 \(j\in [1,m+1]\),且 \(j=0\) 也参与转移,有 \(0\le x-y \le m\)。
那么有两条直线 \(y=x-(m+2),y=x+1\) 不能接触。
直接使用反射容斥即可。
::::
斯特林数
::::info[概念]
第一类斯特林数 \({n\brack m}\)
求把 \(n\) 个不同元素构成 \(m\) 个非空圆排列的方案数。
公式:
第二类斯特林数 \(n\brace m\)
求把 \(n\) 个不同元素划分成 \(m\) 个非空子集的方案数。
通项:
公式:
::::
第一类斯特林数
::::success[P4609 [FJOI2016] 建筑师]
观察发现 \(n\) 一定可以被看到。
则 \(n\) 左边有 \(A-1\) 个从左边看一定可以看到,\(n\) 右边有 \(B-1\) 个一定可以被看到。
则把左右每个可以看到的数和被它挡住的数看作一个集合,只要把每个集合的元素确定了,然后把最大的放前面,其他随便排即可。
那么一个大小为 \(k\) 的集合排法为 \((k-1)!\),发现就是圆排列。那么,把 \(n-1\) 个数分到 \(A+B-2\) 个相同圆排列就是 \({n \brack A+B-2}\)。
接着,这 \(A+B-2\) 个集合要选出 \(A-1\) 个排到左边,\(B-1\) 个排到右边,只要分配好了,两边的集合按最大值从小到大排即可。直接就是 \(\binom{A+B-2}{A-2}\)。
\begin{aligned}
ans&=\sum_{x=1}^n x^k\binom{n}{x}\&=
\sum_{x=1}^n \sum_{i=0}^x {k \brace i} i!\binom{x}{i}\binom{n}{x}\&=
\sum_{x=1}^n \sum_{i=0}^x {k \brace i} i!\binom{n}{i}\binom{n-i}{x-i}\&=
\sum_{i=0}^k {k \brace i} i!\binom{n}{i}\sum_{x=i}^n \binom{n-i}{x-i}\&=
\sum_{i=0}^k {k \brace i} n{\underline{i}}\sum_{x=0} \binom{n-i}{x}\&=
\sum_{i=0}^k {k \brace i}n{\underline{i}}2
\end{aligned}
\begin{aligned}
ans&=\sum_{i=1}^n \binom{n}{i} i^k (\frac{1}{m})^i (\frac{m-1}{m})^{n-i} \&=
\frac{1}{mn}\sum_{i=1}n \binom{n}{i} \sum_{j=0}^i {k \brace j} j! \binom{i}{j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\sum_{i=1}^n \binom{n}{i}\binom{i}{j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\sum_{i=1}^n \binom{n}{j}\binom{n-j}{i-j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\binom{n}{j}\sum_{i=1}^n \binom{n-j}{i-j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\binom{n}{j}\sum_{i=1}^n m^{n-j}
\end{aligned}
\begin{aligned}
\sum_{i=1}^n i^k &= \sum_{i=1}^n \sum_{j=0}^i {k\brace j} j! \binom{i}{j} \&=
\sum_{j=0}^k {k\brace j} j! \sum_{i=j}^n \binom{i}{j} \&=
\sum_{j=0}^k {k\brace j} j!\binom{n+1}{j+1}
\end{aligned}
为了用上公式,或者说是下降幂转化组合数的trick,记 \(f(k)=\sum_{i=0}^ma_ik^i=\sum_{i=0}^mb_ik^{\underline{i}}\)。
做到这里就把组合数化掉了,斯特林数和下降幂都是容易求的。
再来看历史遗留问题 \(b_i\) 的值:
所以
求 \(b_i\) 可以 \(O(m^2)\) 做。
总复杂度为 \(O(m^2)\),瓶颈在求斯特林数和求 \(b_i\)。
::::
::::success[CF1342E Placing Rooks 组合意义]
-
\(k=0\) 时,\(ans=n!\)。
-
\(k\ge n\) 时,\(ans=0\)。
-
\(1\le k\le n-1\):
根据条件,每一行或每一列至少要放一个车。
从每一行要放车的视角来看:
发现只要有 \(k\) 列不放车,就必然会有 \(k\) 对车相互攻击。那么在剩下的 \(n-k\) 中,\(n\) 辆车被分到了 \(n-k\) 个不同的盒子,盒子非空。
由于第二类斯特林数要求相同的盒子,所以应该是 \((n-k)!{n \brace n-k}\)。
然后要先选出 \(n-k\) 列,所以要乘 \(\binom{n}{n-k}\)。
由于行的视角和列的视角时一样的,所以还要乘 \(2\).
发现数据范围不能推斯特林数,考虑通项。
复杂度 \(O(n\log n)\)。
::::
拉格朗日插值
::::info[概念]
已知 \(n\) 次多项式 \(f(x)\) 的 \(n+1\) 个点值 \((x_i,y_i)\),有:
可以做到 \(O(n^2)\) 求一个点值。
::::
::::success[CF622F The Sum of the k-th Powers 自然数幂和]
使用斯特林数可以做到 \(O(k^2)\)。
使用拉格朗日插值可以做到 \(O(k\log k)\)。
结论:自然数幂和是一个关于 \(n\) 的 \(k+1\) 次多项式。
我们容易得到前 \(k+2\) 项的自然数幂和。
为了方便计算,我们处理出 \(F=\prod (x-x_i)\)。
则有
若取 \(x_i=i\),有
阶乘和下降幂都可以直接线性推,所以瓶颈在求 \(k+2\) 个点值和求逆元使用的快速幂,复杂度 \(O(k\log k)\)。
更新!!!!!!
前面推出来的式子还存在问题。如果存在 \(i\) 使得 \(x=x_i\),则 \(F=0\),且 \((x-x_i)\) 的逆元也无法求。
正确的做法是避免逆元,通过前缀积和后缀积拼凑出结果。
::::
Part 2
容斥
::::info[概念]
::::
::::success[CF1895F Fancy Arrays [存在/任意]容斥]
对于第一个限制,我们转为一个更容易的 [存在] 和一个 [任意]。
即
- 对于 \(ans(\exist a_i\in [0,x+k-1])\)。
只要保证最小值小于 \(x+k\) 即可。
为了找到最小值的位置,且方便满足第二个限制,我们先确定出差分数组,差分数组只会影响相对位置,以确定最小值的位置,而不影响最小值的绝对大小。
则差分数组有 \(n-1\) 项,每一项都属于 \([-k,k]\) 之间,有 \(2k+1\) 种取值,且互不干扰。所以差分数组有 \((2k+1)^{n-1}\) 种。
然后在让最小值位于 \([0,x+k-1]\),有 \(x+k\) 种取值,所以 \(ans=(x+k)(2k+1)^{n-1}\)。
- 对于 \(ans(\forall a_i\in [0,x-1])\)。
发现 [任意] 这个限制就比较宽松。
我们可以直接 \(dp\) ,记 \(f_{i,j}\) 表示考虑前 \(i\) 个数且 \(a_i=j\) 的方案数。
有
复杂度为 \(O(nx)\)。
考虑矩阵快速幂优化 \(dp\),做到 \(O(x^3\log n)\)。
当然,如果 \(k\ge x-1\),此处 \(ans=x^n\)。
::::
::::success[P3349 [ZJOI2016] 小星星]
算法一:
考虑树形dp。
记 \(f_{u,i,S}\) 表示现在在考虑 \(u\) 的子树,\(u\) 映射到 \(i\),\(S\) 表示 \(u\) 子树内的点所映射到的集合。
则
算一下时间复杂度,发现要枚举 \(i,S,T,j\) ,再加上树形dp的遍历复杂度,总复杂度为 \(O(n^33^n)\)。可过 \(n\le 10\)。
接下来把 \(3^n\) 优化掉。
考虑去掉 \(S\) 这一维,再用容斥。
新的转移方程为:
要枚举 \(i,j\),复杂度 \(O(n^3)\)。
由于没有限制 \(j\) 的范围,所以其中会出现多重映射。
如果记 \(g_S\) 表示限制 \(j\in S\) 做上述转移的结果。
则
考虑来理解一下这是怎么回事。
对于一个 \(g(\{i\})\),只有一个元素的情况,每个点都会重复映射到 \(i\),可以理解为 \(i\) 在做全集时所重复映射的值,然后通过容斥得到全集的没有重复映射的结果。
::::
::::info[凑容斥系数]
:::info[广义容斥框架]
目标:求满足条件 \(ans\) 的对象的贡献和。
方法:
- 构造容易计算的条件 \(C_1, C_2, \dots, C_n\)(通常是" 至少")。
- 为每个条件设计容斥系数 \(f_1, f_2,\dots, f_n\)。
- 使得每个对象都满足:
错排问题: 求满足所有 \(pi \not= i\) 的 长度为 \(n\) 的排列个数(记为 \(D_n\))。
条件 \(C_k\) 表示至少有 \(k\) 个位置 \(p_i=i\) 的排列个数。
考虑一个有 \(m\) 个位置 \(p_i=i\) 的排列,其对 \(C_k\) 的计算次数为 \(\binom{m}{k}\),其对 \(ans\) 的贡献为 \([m=0]\)。
列出方程:
对于所有 \(m\in [0,n]\) 都满足此式,一共有 \(n+1\) 个式子,\(n+1\) 个变量,可以解出 \(f_k\)。
直接用二项式定理,\([m=0]=(1-1)^m=\sum\limits_{k=0}^m\binom{m}{k}(-1)^k\)。
所以 \(f_k=(-1)^k\)。
计算答案:
:::
例:
有 \(n\) 个排列,每个排列有一个价值。
价值规则:如果恰好有 \(k\) 个位置满足 \(p_i \not= i\),价值为 \(a_k\)。
求所有排列的价值之和。
解法一:
记 \(C_k\)(\(k\in [0,n]\)) 表示至少有 \(k\) 个位置满足 \(p_i=i\) 所有排列的价值和。
考虑通过容斥解决。
如果是一般的容斥我们在重复计算和去重时的权值可能不同,无法得到正确答案。
考虑配上一个系数使得容斥的结果正确。
对于一个有 \(m\) 个位置满足 \(p_i=i\) 的排列,它对 \(C_k\) 的计数次数为 \(\binom{m}{k}\),它对 \(ans\) 的贡献为 \(a_n-m\)。
有:
其中,直接有 \(f_0=a_n\)。
则可以从 \(0\) 到 \(n\) 递推出所有 \(f_k\),复杂度 \(O(n^2)\)。
解法二:
直接使用组合意义。
::::
反演
二项式反演
::::info[二项式反演]
第一形式
此式可以把恰好转为选择意义上的至多。
:::warning[证明]
:::
第二形式
此式可以把恰好转为钦定意义上的至少。
::::
::::success[AT_abc423_f Loud Cicada]
转为求至少。
\(g_i\) 表示至少 \(i\) 只蝉的方案数。
有
直接二项式反演形式二:
::::
::::success[P10596 BZOJ2839 集合计数]
考虑恰好转至少。
记 \(g_i\) 为交集至少为 \(i\) 的方案数。
则
接下来直接反演。
::::
::::success[P4859 已经没有什么好害怕的了]
记 \(f_i\) 表示恰好有 \(i\) 对 \(a>b\) 的方案数。
若 \(n+k\) 为奇数,则无解。
若 \(n+k\) 为偶数,则答案为 \(f_{\frac{n+k}{2}}\)。
直接把 \((n+k)/2\) 记为 \(k\),考虑计算 \(f_k\)。
转化恰好为钦定至少。
记 \(g_i\) 表示现在钦定至少有 \(i\) 对 \(a>b\) 的方案数。
设 \(dp_{i,j}\) 表示前 \(i\) 个位置,匹配了 \(j\) 个 \(a>b\) 的方案数。容易转移。
\(g_i=(n-i)!dp_{n,i}\)。
使用二项式反演第二种形式即可。
::::
::::success[P6076 [JSOI2015] 染色问题 多重二项式反演叠加]
文字中都是至少,其实是 [恰好有 \(n\) 行出现染色] [恰好有 \(m\) 行出现染色] [恰好有 \(C\) 种颜色出现过]
考虑直接把三个恰好全部转为至少:
则 \(g_{i,j,k}\) 表示至多有 \(i\) 行,至多有 \(j\) 列出现了染色,至多有 \(C\) 种颜色可用。
有 \(g_{i,j,k}=(k+1)^{ij}\)。
这里的答案为
直接做是 \(O(nmC\log(nm))\) 的,可过。
在第一层循环预处理 \(k+1\) 的幂,可做到 \(O(nmC)\)。
其实可以优化为两个求和。
看最后一个求和,整理为:
由于 \(g_{i,j,k}\) 中有一层 \(()^i\) ,刚好可以用二项式定理搞回去。
所以这一个求和化为 \(((k+1)^j-1)^n\),复杂度降为 \(O(Cm\log n)\)。
::::
::::success[AT_abc235_g Gardens]
发现可以把恰好 \(n\) 个花园转为至多 \(n\) 个花园。
至多 \(x\) 个的方案数
发现一个式子,
容易在杨辉三角上证。
则可以用此式来递推所有 \(n\) 的 \(\sum\limits_{i=1}^{A/B/C}\binom{n}{i}\)
复杂度 \(O(n)\)。
::::
::::success[P10597 BZOJ4665 小 w 的喜糖]
记 \(g_x\) 表示至少有 \(x\) 个位置相同的方案数,\(m\) 表示颜色数。
套用二项式反演
考虑 \(dp\) 求 \(g_i\)。
记 \(f_{i,j}\) 表示前 \(i\) 种颜色至少有 \(j\) 个位置相同的方案数。
\(g_i=(n-i)!f_{m,i}\)
其中的阶乘拼一起就是多重集排列数。
分析一下发现,复杂度其实是 \(O(n^2)\) 的。
::::
::::success[P6478 [NOI Online #2 提高组] 游戏]
把恰好转为至少。
记 \(g_i\) 表示至少 \(i\) 次非平局的方案数。
再记 \(f_{i,j,0/1}\) 表示 \(i\) 的子树内,以及钦定了 \(j\) 组非平局,\(i\) 点当前没有/已经被钦定。
容易写出转移方程。复杂度 \(O(n^2)\)。
当然,也可以设为 \(f_{i,j}\),转移方程不同,常数更小。
::::
::::info[小结]
一般可以通过二项式反演来简化问题中的恰好。
-
使用完二项式反演后,可能要 \(dp\) 或使用组合意义。
-
可以使用高维二项式反演。若复杂度过高,需优化或考虑组合意义。
::::
子集反演
::::info[子集反演]
:::warning[证明]
:::
::::
::::success[P6442 [COCI 2011/2012 #6] KOŠARE]
使用子集反演,转恰好为子集。
记 \(f_S\) 表示种类恰好为 \(S\) 的方案数,\(g_S\) 表示种类为 \(S\) 的自己的方案数。
则显然有
可以使用子集反演。
然后记 \(h_S\) 表示种类是 \(S\) 的子集的盒子数量,可以使用高位前缀和求。
则 \(g_S=2^{h_S}\),问题解决。
::::
::::success[AT_arc101_c Ribbons on Tree]
考虑子集反演。
设 \(f_S\) 表示恰好 \(S\) 中的边没有被染色的方案数。
设 \(g_S\) 表示至少 \(S\) 中的边没有被染色的方案数,即染色的边集是 \(E-S\) 的子集。
有
子集反演为:
答案为
接着树形DP。
记 \(dp_{u,i}\) 表示点 \(u\) 的子树内,与 \(u\) 相连的连通块大小为 \(i\)。若边未染色,视为断开。
对于每个子节点 \(v\),有
表示 \((u,v)\) 这条边断开,并计算 \(v\) 连通块内的方案数。其中 \(val_j=(j-1)(j-3)(j-5)\dots\) (\(j\) 为偶数),表示与 \(v\) 相连的连通块内的连边方案数(当然这样可能会产生没有被染色的边,但我们求的是至少)。\((-1)\) 是把系数 \((-1)^{|T|}\) 放入了 \(dp\) 中,这里是把 \((u,v)\) 计入了 \(T\),使得 \(|T|\) 变化。
表示 \((u,v)\) 这条边连上。
边界为 \(dp_{u,1}=1\)。
则答案为
复杂度为树形DP的复杂度 \(O(n^2)\)。
::::
\(\min\)-\(\max\) 反演
::::info[\(\min\)-\(\max\) 反演]
该结论在期望意义下也成立。即:
推广:
直接证明推广。
:::warning[证明]
考虑构造容斥系数。
记 \(kth\max(S)=\sum\limits_{T\sube S}f_{|T|}\min(T)\)。
接着来算每个元素对等式两边的贡献。
对于 \(S\) 中的第 \(i\) 大的元素,我们可以从它前面 \(i-1\) 个元素中选出一些来和它组成 \(T\),则该元素为 \(\min(T)\) 的结果。
可以列出对右边的贡献:$$\sum\limits_{j=0}^{i-1}\binom{i-1}{j}f_{j+1}$$。
最左边的贡献:\([i=k]\)。(\([x]\) 为艾弗森括号)
有方程
接着使用二项式反演。
记 \(g_{i-1}=[i=k]\),\(f'_j=f_{j+1}\)
有
则
即:
代入总式:
:::
::::
::::success[P3175 [HAOI2015] 按位或]
把原问题描述为最后一个数位出现的秒数的期望值,即所有数位出现秒数的最大值。
考虑转为最小值,即最先出现的,这是容易求的。
给出一个具有一般性的结论:
给出一个事件成功的概率 \(p\),失败的概率 \(1-p\),重复进行事件直到事件成功,期望次数为 \(\frac{1}{p}\)。
考虑求一个集合 \(S\) 的 \(E(\min(S))\)。
根据结论,考虑求出概率。
\(P(S)\) 表示能够一次得到其中一个数位的概率。
则
对 \(p\) 做高维前缀和可以 \(O(1)\) 求 \(P(S)\) ,高位前缀和复杂度 \(O(n2^n)\)。
\(E(\min(S))=\frac{1}{P(S)}\),再用 \(\min\)-\(\max\) 反演,复杂度为 \(O(2^n)\)。
总复杂度为 \(O(n2^n)\)。
::::
::::success[P4707 重返现世]
上一题的升级版,在反演和放容斥系数上使难度增加了很多。
考虑像前一题一样转化,改为求第 \(k\) 大,这里的 \(k\) 可以表示为原题给出的 \(n-k+1\)。
先把反演公式供上来:
其中 \(E(\min(T))\) 同上题求法,为 \(\Large\frac{m}{\sum_{i\in T}p_i}\)。
然后发现需要 \(O(n2^n)\) 的复杂度来求。
由于式子中只有 \(T\) 一个变量,考虑用关于 \(T\) 的 dp 来计算。
记 \(f_{i,j}\) 表示满足只考虑前 \(i\) 个物品,\(\sum\limits_{i\in T}p_i=j\) 的\(\sum_{T\sube U}(-1)^{|T|-k}\binom{|T|-1}{k-1}\) 总值。
有转移方程
表示不把 \(i\) 加入 \(T\) 中,则没有任何影响。
对于加入的情况:
从 \(f_{i-1,j-p_i}\) 到 \(f_{i,j}\),所有值的 \(|T|\) 会变,其中 \((-1)^{|T|-k}\) 只要乘 \(-1\) 即可,但是组合数不能直接变化。考虑等式 $$\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}$$,我们在 \(f_{i,j}\) 中的每一项的组合数对于 \(\binom{n}{m}\),而 \(\binom{n-1}{m}\) 就可以对应 \(f_{i-1,j-p_i}\) 中的组合数,考虑再找一个状态表示 \(\binom{n-1}{m-1}\) 来做整体转移。
由于 \(\binom{n-1}{m-1}\) 中对应 \(\binom{|T|-2}{k-2}\),而在已有的状态里,都是下面为 \(k-1\) 的,无法得到这一项 \(\binom{n-1}{m-1}\),考虑扩展状态为 \(f_{i,j,k}\) 表示 \(k\) 的取值。
则有转移 :
至于初始状态,可以反推出初始状态为 \(f_{0,0,0}=0\),其他 \(f_{k,0,0}=-1\)。
复杂度 \(O(nmk)\),在转化后 \(k \le 11\)。
实现时要把 \(i\) 这一维空间压缩掉。
::::
::::success[AT_agc038_e Gachapon]
也是第一题的升级版,在组合意义上和放容斥系数上难度增加了,可以说和上一题各有千秋。
直接使用普通的 \(\min\)-\(\max\) 容斥。
有
则考虑求 \(E(\min(S))\),此处 \(E(\min(S))\) 表示 \(S\) 中第一次有元素顶到上界的期望次数。
首先求出单次选到 \(S\) 内部的概率,令 \(m=\sum\limits_{i=0}^{n-1} a_i\),则结果为 \(\Large\frac{m}{\sum\limits_{i\in S}a_i}\),那么期望选进 \(S\) 的次数 \(P\) 为 \(\Large\frac{m}{\sum\limits_{i\in S}a_i}\)。
来考虑如何求出这个第一次顶到上界的期望次数。
尝试刻画到达目标时的状态,记 \(S\) 中的元素 \(i\) 被选出的次数为 \(c_i\),\(k=\sum\limits_{i\in S}c_i\)。则所求其实就是 \(E(k)\)。考虑拆贡献,从每个 \(c_i=0\) 的初始状态,到最终状态,其间就共有 \(k\) 个状态,且满足 \(c_i<b_i\),每个状态都有 \(1\) 的贡献,那么求出到达每个状态的概率之和即可。那么,生成 \(k\) 个元素的概率为 \(\Large\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i}\),这 \(k\) 个元素出现的顺序有 \(\Large\frac{k!}{\prod\limits_{i\in S}c_i!}\) 种。总共为 \(\Large\frac{k!}{\prod\limits_{i\in S}c_i!}\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i}\)。当然,放在整个 \(U\) 中的话,还要乘 \(P\)。
所以
接下来就是 \(dp\) 了。
观察一下,后面一坨里 \(j=\sum\limits_{i\in S}a_i,k=\sum\limits_{i\in S}c_i\),则 \(j,k\) 由于需要求和不好放入 \(dp\) 里,则把它计入状态。
记 \(f_{i,j,k}\) 表示只考虑前 \(i\) 个元素,\(j,k\) 定义同上。然后做背包dp。
如果不选 \(i\) 加入 \(S\):
否则
其中 \(c<b_i\)。
初始状态为 \(f_{0,0,0}=-1\)。(空集的 \((-1)^{|S|+1}=-1\))
答案为
分析一下复杂度,要枚举 \(i,j,k,c\),\(i,c\) 的枚举总量是 \(\sum b_i\),是 \(O((\sum a_i)(\sum b_i)^2)\) 的。
::::
::::info[小结]
-
\(\min\)-\(\max\) 反演通常用来处理期望问题。
-
若数据范围不支持指数复杂度的子集枚举,考虑把容斥系数放入 \(DP\)。
::::
斯特林反演
::::info[斯特林反演]
::::
::::success[[2018 雅礼集训 1-16] 方阵]
题目描述:
给定一个 \(n \times m\) 的矩阵,每个位置可以填上 \([1,c]\) 中的任意整数。
要求填好后任意两行互不等价,且任意两列互不等价。
求方案数。
\(n,m \le 4 \times 10^3\),时限 1s。
考虑去掉列的限制,只考虑行互不等价。
记 \(f_{n,m}\) 表示 \(n\) 行 \(m\) 列 不考虑列的限制的答案。有 \(f_{n,m}=(c^m)^{\underline{n}}\)。
记 \(g_{n,m}\) 表示真实答案。
有
表示枚举 \(m\) 列中有 \(i\) 列本质不同的等价类,把 \(m\) 列分到 \(i\) 个等价类中,再用 \(g_{n,i}\) 选出这 \(i\) 个等价类以及它们之间的相对关系(毕竟斯特林数中盒子是相同的)。
再使用斯特林反演:
可以 \(O(nm)\) 求解。
::::
::::info[小结]
斯特林反演一般与连通图计数有关,一般结合线性基考察。
::::
Part 3
生成函数
::::info[前置]
广义二项式系数:
广义二项式定理:
上指标反转:(用于化简负数上标)
::::
普通型生成函数(OGF)
::::info[OGF]
对于数列 \(A_0,A_1,\dots,A_n\),其普通型生成函数定义如下:
OGF常常和“无标号”计数相关。原理可以使用乘法原理。
相关函数展开:
有关组合意义:
\(1+x+x^2+\dots +x^k\) :至多选 \(k\) 个。
\(\Large\frac{1}{1-x}\):无限制。
\(\Large\frac{1}{1-x^2}\): 只能选偶数个。
\(\Large\frac{x}{1-x^2}\): 只能选奇数个。
\(\Large\frac{1}{1-x^k}\):只能选 \(k\) 的倍数个。
::::
::::success[P2000 拯救世界]
\([n]T(x)=\binom{n+4}{4}\)。
::::
指数型生成函数(EGF)
::::info[EGF]
对于数列 \(A_0,A_1,\dots,A_n\),其指数型生成函数定义如下:
EGF常常和“有标号”计数相关,即物品相互区分。
:::warning[定义原则]
对于有标号问题,当两个生成函数合并时,有
即先选择 \(n\) 个标号中的 \(i\) 个标号给 \(F(i)\)。
拆开组合数有:
所以定义为 \(\Large\frac{x^i}{i!}\)。
:::
相关泰勒公式:
组合意义:
无要求:$$\large\sum\limits_{i\ge 0}\frac{xi}{i!}=ex$$
数量为偶数:$$\large\sum\limits_{i\ge 0}\frac{x{2i}}{(2i)!}=\frac{ex+e^{-x}}{2}$$
数量为奇数:$$\large\sum\limits_{i\ge 0}\frac{x{2i+1}}{(2i+1)!}=\frac{ex-e^{-x}}{2}$$
::::
::::success[P2012 拯救世界2]
\(ans=\frac{1}{256}(12^n+4\times 8^n+6\times 4^n+4\times (-4)^n)\)
当 \(n<4\) 时,\(ans=0\)。
::::
多项式操作
::::info[前言]
多项式操作用于辅助生成函数的计算。
此部分不包含多项式科技(如 NTT,FFT),但多项式科技复杂度可以更优。
::::
::::info[多项式求逆]
给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)A(x)\equiv 1 (\bmod \ x^n)\)。
有递推式:
边界:\(B_0=\Large\frac{1}{A_0}\)。
时间复杂度 \(O(n^2)\)。
:::warning[证明]
列出方程:
此处设 \(n\ge 1\),再把 \(A_0B_n\) 一项单独拿出来。
:::
::::
::::info[多项式求 \(\ln\)]
给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)\equiv \ln A(x) (\bmod \ x^n)\)。(\(A_0\not =0\))
有递推式:
时间复杂度 \(O(n^2)\)。
:::warning[证明]
对两边求导:
即
又有 \(A'_i=(i+1)A_{i+1}\),\(B'_i=(i+1)B_{i+1}\)
把 \(nA_0B_n\) 一项单独拿出来:
注意到 \(A_0 \not =0\)。
:::
::::
::::info[多项式求exp]
给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)\equiv e^{A(x)} (\bmod \ x^n)\)。
有递推式:
边界:\(B_0=1\)。
时间复杂度 \(O(n^2)\)。
:::warning[证明]
对两边求导:
即
又有 \(A'_i=(i+1)A_{i+1}\),\(B'_i=(i+1)B_{i+1}\)
:::
::::
::::success[问题一]
你有若干种颜色不同的骨牌,其中大小为 \(1 × i\) 的骨牌共有 \(a_i\) 种。每种骨牌都可以无限量使用。用骨牌不重叠地铺满一排 \(1 × n\) 的方格,共有几种方法?(\(a_i, n ≤ 5000\))
先构建只放一个骨牌的生成函数。
有 $$A(x)=\sum a_ix^i$$,可以容易验证。
枚举放置骨牌的数量:
使用多项式求逆 \(O(n^2)\) 做。
::::
::::success[问题二]
求包含 \(n\) 个顶点,\(n\) 条边的连通无向图有几个。顶点有标号。不允许重边和自环。\((n ≤ 5000)\)
考虑把基环树拆为环和接在环上的树。
有标号有根树的种类的生成函数:
再枚举环的大小,且去除环的旋转和反转带来的重复,有:
使用多项式求\(\ln\) \(O(n^2)\) 做。
::::
::::success[P4841 [集训队作业2013] 城市规划]
先考虑一下 \(\exp(F(x))\) 的本质。
若 \(F(x)\) 可以生成不同的小方案,而 \(F^n(x)\) 代表同时生成 \(n\) 个方案,即从每个 \(F(x)\) 中选出一个方案再合并为大的方案。
发现在多项式的乘法中,有不同的选择方式可以得到同一个大方案,则发现可能会有本质相同的情况被重复计算。那么容易发现算重的次数为排列数,即 \(F^n(x)\) 生成的是小方案的排列。
\(\exp(F(x))\) 中除去了重复的情况,得到的就是集合。所以 \(\exp(F(x))\) 的本质是生成所有 \(F(x)\) 可以组成的集合。
回归本题,记 \(T(x)\) 为无向简单连通图个数的生成函数,我们考虑 \(F(x)=\exp(T(x))\) 代表了什么。
依照上面的理解,\(\exp\) 就是枚举生成集合的大小,再将方案数相加。这里就是枚举生成了多少个无向简单连通图,在把方案数相加。
那么每一项系数代表了什么?
第 \(n\) 项的系数 \(F_n\),它包括了所有无向简单连通图构成的集合,这些集合的总大小为 \(n\)。其实,就是 \(n\) 个点的无向简单图的方案数,因为我们枚举了所有图中连通块的个数,也用 \(T(x)\) 表示了每一个连通块的情况。
在根据无向简单图的方案数有:
而 \(F(x)=\exp(T(x))\),即 \(T(x)=\ln(F(x))\),\(O(n^2)\) 用多项式求 \(\ln\) 即可。
呃,发现我们的 \(F_0=0\),也就是说无法使用 \(O(n^2)\) 的求 \(\ln\),只能用多项式科技。
::::
::::success[更多问题(NTT入侵)]
\(n\) 个生成函数的卷积,由于该函数的性质可以 \(O(1)\) 得到 \(\ln\) 后的系数,则先算 \(\ln\) 求和后的结果,可以做到 \(O(\sum \frac{m}{v_i})\),排完序后再合并重复的,就可以做到最劣 \(O(n\ln n)\) 的处理。最后 \(\exp\) 转为原式即可。
::::
浙公网安备 33010602011771号