组合计数 题解集
P4931 [MtOI2018]情侣
简要题意
给定 \(T\) 个 \((n,k)\) 二元组,求
\(T\le 2\times10^5,k\le n\le 5\times 10^6\)。
题解
其中 \(u(x)=\displaystyle\frac{(-2)^k}{k!},v(x)=\binom{2x}{x}\),\(U,V\) 是 \(u,v\) 的生成函数,则有
推导见 link。则有
对比系数有
直接线性递推即可。
预处理 \(O(n)\),计算 \(O(1)\)。
record
AGC060C Large Heap
简要题意
给定一个深度为 \(n\) 共 \(2^n-1\) 个结点的满小根堆,堆的元素由 \(1\) 到 \(2^n-1\) 的排列构成,额外给定一个左链上的结点 \(A\) 和一个右链上的结点 \(B\),要求额外满足 \(A\) 小于 \(B\),问满足额外条件的堆的数量除以正常的堆的数量。
(忽略其中一些子树)
题解
相当于给定一张特殊图,问合法的拓扑序数量。先考虑平凡的情况,不考虑额外限制,对于一个单独的小根堆,我们自顶向下确定拓扑序:记 \(g_i\) 表示深度为 \(i\) 的满小根堆的合法拓扑序数量,则有堆顶的元素必须在拓扑序的第一位,两棵子树互相独立,有
参考平凡情况,接下来考虑多了一条特殊边怎么做:
最顶端的结点显然一定排在拓扑序的最前面,可以去掉,考虑如下的图:
则拓扑序的第一位必然为第 \(n-1\) 层的两个结点中之一,如果选定左链的结点,去掉后剩下的图为一个深 \(n-2\) 的满二叉树和下图:
注意到以上两张图具有相同的结构:两条链上挂着若干个满二叉树,第二条链下数第 \(B\) 个结点向第一条链下数第 \(A\) 个结点连一条边,不妨把这种结构记为 \(\mathcal{G}_{x,y}\),其中 \(x,y\) 是两条链的长度。记 \(f_{x,y}\) 为 \(\mathcal{G}_{x,y}\) 的合法拓扑序的数量,\(\mathcal{G}_{x,y}\) 可以作为拓扑序第一个元素的结点只有两个,枚举这两个结点,\(f\) 可以递推,我们有
边界条件为
同样都是枚举拓扑序的第一位,然后将问题转化为子问题递推。
注意到带有 \(2\) 的次幂的组合数我们无法处理,考虑将第一个式子的组合数拆开
令 \(\displaystyle F_{x,y}=\frac{f_{x,y}}{(2^x+2^y-2)!},G_x=\frac{g_x}{(2^x-1)!}\)
则有
最终答案为 \(\displaystyle\frac{F_{n-1,n-1}}{G_{n}(2^n-1)}\)。
record
CF1821F Timber
简要题意
在 \([1,n]\) 中选 \(m\) 个整数。对于一个选择方案,对方案中的所有整数,选择区间 \([m-k,m],[m,m+k]\) 中的一个,组成一个集合,称为该方案的生成集。称一个选择方案是合法的,当且仅当存在一个生成集的交集为空集。
问合法选择方案的数量,\(n,m,k\le 3\times10^5\)。
题解
考虑如何判定一个方案是否合法,我们可以使用贪心策略:从小到大决策,每次优先选择区间 \([m-k,m]\)。
根据贪心策略可以写出生成函数
则答案为
P.S. 最开始做的时候想到统计生成集之后就去想容斥,然后想得非常复杂才做出来,甚至某些系数是碰巧凑出来的。生成函数的解法应当是更加自然和本质的,因为最后复盘的时候对容斥系数的证明还是用到了一开始提到的贪心策略。
对于一些对满足条件的计数问题先找到简洁的判定方式再计数。
NFLS 1
简要题意
给定一个有 \(n\) 个点的完全图,按所有方案等概率随机给边赋权,使边权是 \(1,2,...,\displaystyle\frac{n(n-1)}{2}\) 的一个排列。如果一条边在一个端点处最优,当且仅当 这条边的边权 为 该端点的边的边权 的最大值,令一条边为关键边,当且仅当它在至少一个端点处最优。问以关键边为边集的生成子图的连通块个数为 \(k\) 的概率。\(n\le 1e6\)
题解
注意到关键边不会形成环,否则考虑环中权最小的边 \(e_0\),显然有 \(e_0\) 不是关键边矛盾,故关键边的生成子图构成一个森林。不难注意到每一棵树和一条在两个端点处都是最优的边(称为双向边)一一对应,故题目条件即为这样的边的数量恰好等于 \(k\)。
显然可以二项式反演,记 \(g(x)\) 为至少 \(x\) 条双向边的方案数,则有
考虑如何计算 \(g(x)\),首先我们钦定 \(x\) 条边,保证这些边是双向边,注意到这相当于要求这些边 邻域内的边的边权 都小于 它的边权 ,也就是说要求满足某些边之间边权的大小关系。
于是考虑先对关键边排序,总方案数乘上 \(k!\),从小到大考虑关键边,记为 \(e_1,e_2,\cdots,e_k\),每条边可以看作只被邻域内最小的双向边直接约束,记 \(g_i\) 为被 \(e_i\) 直接约束的边的数量(不算自己),若已经考虑了 \(e_1\sim e_{i-1}\) 和被其直接约束的边,令 \(\displaystyle p_i=i+\sum_{j=1}^i g_i\)(\(e_1\sim e_{i-1}\) 和被其直接约束的边 的数量),则如果要考虑 \(e_i\),总方案数要乘上
其中 \(\displaystyle\binom{p_{i-1}+g_i}{g_i}\) 表示将 \(e_i\) 放在当前序列的最后面,然后将 \(g_i\) 插入之前的 \(p_{i-1}\) 条边中,考虑到 \(g_i\) 之间无约束,乘上 \(g_i!\)。
则总贡献为
易知 \(p_i=2n-4i\),有约束的边有 \(\sum p_i=2xn-2x^2+x\) 条,故没有约束的边的贡献为
考虑如何选择钦定的边,注意到钦定的边两两不相交,先选出 \(2k\) 个顶点,再两两配对,则有贡献 \(\displaystyle\binom{n}{2k}(2k-1)!!\)。
故有
最终答案为
record
tips
一眼二项式反演,类似的题挺多的,直接推式子还要练一练。
NFLS 2
简要题意
给定大小为 \(n\) 的可重集 \(A\),问有多少个子集 \(B\) 满足所有元素的与为 \(0\),且 \(B\) 的所有子集 \(C\) 的所有元素的与都不为 \(0\)。\(n\le 100,V\le 512\)。
题解
为了简化题意把 \(A\) 中所有元素 \(a\) 变成 \(U-a\),则按位与为 \(0\) 变为按位或为 \(U\)。注意到没有极小性的限制则可以直接 \(FWT\) 做,极小性显然考虑容斥:对于二元组 \((B,C)\),满足 \(B\subset C\),去掉 \(B\) 中任意一个元素 \(C\) 的元素按位或仍然为 \(U\),令该二元组的权值为 \((-1)^{|B|}\),则所有合法二元组的加权和即为答案。
考虑有哪些合法的二元组,显然有 \(B\) 中元素独立,对任意 \(B\) 中元素 \(b\),对于 \(b\) 每一个为 \(1\) 的位,\(A\) 中至少存在一个不是 \(b\) 的元素在这一位也为 \(1\),即 \(b\) 是其他不同于其的元素的按位或的 子集。
由于各个元素相互独立,我们可以分阶段决策,考虑动态规划:设当前决策的数为 \(x\),如果 \(x\in B\),则由前文条件我们要维护已决策的数的按位或 \(y\)。但是对于某一位 \(i\) 满足 \(x_i=1\) 且 \(y_i=0\) 则后面应至少选择一个数在这一位上为 \(1\)。
因此我们记 \(f(i,j)\) 表示当前所有选择的数的按位或为 \(i\),后面选择的数在 \(j\) 位上必须有 \(1\) 的方案加权和,则有
其中第一行是不选 \(x\),第二行是把 \(x\) 选入 \(C\) 不选入 \(B\),第三行是把 \(x\) 选入 \(B,C\)。注意负号。
最终答案是 \(f(U,0)\)。
record
tips
容斥可以考虑抽象成二元组带权计数,不要看到位运算相关就觉得一定要 FWT。
dp 的时候可以记一些限制留给后面的决策解决。