容斥与二项式反演
无所谓,因为我已经钦定过你了。
不是特别成熟,未来大概率会再次完善。
容斥原理
上式子:
一堆数里面选奇数个和偶数个的方案相同。也可以从杨辉三角同一行去看,这个结论是容易得到的。
这个有什么用呢?比如说我们想要求\(n\)个元素全部满足某种限制的方案数,等价于求\(0\)个元素不满足限制的方案数。钦定\(0\)个元素不满足限制,其他随意,减去钦定\(1\)个元素不满足限制,其他随意,发现所有\(2\)个元素不满足限制的方案会被重复减去(比如ab不满足限制,然后钦定a的时候被算了一次,钦定b的时候又被算了一次),再加上,然后又需要减去钦定\(3\)个不合法的方案......
jzyz4013 信封问题
这不是我们错排吗,现在从容斥的角度考虑。钦定\(i\)个放在原位,其他随便放,方案数为\((n-i)!C_{n}^{i}\),故根据上面的式子,答案为\(\sum_{i=0}^{n}(-1)^i(n-i)!C_n^i\)。
BZOJ4710 [JSOI2011] 分特产
钦定\(x\)个人分不到特产,其他随意。从每个\(a_i\)来考虑,相当于\(a_i\)个小球,放入\(n-i\)个位置,可以为空,方案为\(C_{a_i+n-i-1}^{n-i-1}\)。故答案为\((-1)^x\sum C_{a_i+n-i-1}^{n-i-1}\)。
jzyz0019 BZOJ3129. 方程(弱化版)
弱化在不需要exLucas。这玩意我不会,先挖坑。
感觉是一个需要转化题意的妙妙题。对于那\(n2\)个变量,不妨将它们都减去\(a_i\),这样就转化成满足正整数就可以了,也就是我们直接令\(m\)先减去\(\sum_{i=n1+1}^{n1+n2}a_i\)。现在只需要考虑前\(n1\)个限制。\(n1\)只有\(8\)?那我直接状压。枚举状态,钦定不合法的,就是\(x_i\ge a_i+1\),仿照\(n2\)进行类似转化即可。
BZOJ1042 [HAOI2008]硬币购物
看上去像是背包,\(4\)种物品,完全背包是可以接受的。考虑枚举\(2^4\)种状态,表示\(4\)种面值钦定是否满足要求。比如二进制下为\(1\)表示钦定不满足,否则随意。对于不满足限制,也就是花钱超过\(d_i\)枚的,我们令目标减去\((d_i+1)c_i\),转化成花了正整数枚,技巧与上一题类似。然后就是随便花花满一个目标,预处理一个完全背包即可。记得乘上\(-1\)的系数。
jzyz6014 水仙花
我认为是很好的题。不合法的情况就是,\(a_{i+1}\)是\(a_i\)的因子。这个东西两个相邻元素之间是有依赖性的,所以单个不好钦定。那怎么办?钦定连续段。可以发现,不合法的连续段是\(\log m\)量级的,预处理\(f_{i,j}\)表示长为\(i\)且以\(j\)开头的不合法连续段的数量,复杂度带上调和级数是\(m\log^2m\)的。以此可以得到\(g_i\)表示长为\(i\)的不合法连续段的数量。然后令\(dp_i\)表示考虑了前\(i\)个数的答案。枚举段长转移,有:\(dp_i=\sum_{j=1}^{\log m}(-1)^{j-1}dp_{i-j}*g_j\)。为什么是\((-1)^{j-1}\)?因为一段不合法的连续段,实际上最后一个位置是合法它,不考虑它,所以实际上看\(j-1\)的奇偶性。再者,我\(dp_i\)的值只与\(i\)往前\(\log m\)个位置有关,所以按长度这样容斥就是对的。
比较有助于加深对容斥的理解。
二项式反演
在容斥的研究中,我们常用到钦定,那么现在来引入恰好,就是字面意思。
现在考虑求恰好\(k\)个元素满足限制的方案数\(f_k\)。我现在会求\(g_k\)表示钦定\(k\)个元素满足限制,能不能尝试找到\(f_k\)与\(g_k\)之间的关系?显然,对于任意\(j\le k\),\(f_k\)会被\(g_j\)算\(C_{k}^{j}\)次,所以有\(g_j=\sum_{k\ge j}C_{k}^{j}f_k\)。所谓二项式反演,就是从形如这样的式子中找到两个未知数互换后的形式。
下面粘上二项式反演的四种形式,具体证明先【挖坑】。
一、
二、
三、
四、
据说前两种最为常见和常用。
BZOJ2839 集合计数
设\(f_i\)表示钦定\(i\)个元素属于交集的方案数,选出\(i\)个是\(C_n^i\),剩下\(n-i\)个元素任意,有\(2^{n-i}\)种状态,每种状态都代表了一个可选的集合,集合任意选,不能不选,所以选集合的方案数就是\(2^{2^{n-i}}-1\),故\(f_i=(2^{2^{n-i}}-1)C_n^i\),设\(g_i\)表示恰好\(i\)个属于交集的方案数,则有\(f_i=\sum_{j=i}^ng_jC_j^i\),反演回去就可以了。
BZOJ3622 已经没有什么好害怕的了
麻烦的点在于配对的问题。解一个方程容易知道,就是求糖果比药片能量大的配对恰好有\(K=(n+k)/2\)组。那么为了方便考虑,将糖果和药片从小到大排序,然后设\(dp_{i,k}\)表示考虑了前\(i\)个糖果,钦定\(k\)组糖果比药片能量大,且只考虑钦定元素的选取方案,不考虑非钦定元素选取方案的方案数,我们想要\(g_i\)表示钦定\(i\)组糖果比药片能量大的方案数,显然有\(g_i=(n-i)!dp_{n,i}\)。这样做是因为直接求\(g_i\)是不好做的,所以相当于把问题分解了,我认为这种思想非常重要。怎样求\(dp_{i,k}\)?我们排序后求一个\(r_i\)表示满足\(b_j<a_i\)的\(j\)最大不超过\(r_i\),枚举当前元素\(i\)和钦定数量\(k\),若\(i\)不是钦定满足要求的,那么\(dp_{i,k}\gets dp_{i-1,k}\),若是,\(dp_{i,k}\gets(r_i-(k-1))dp_{i-1,k-1}\)。然后就可以知道\(g_i\),剩下就是反演了。

浙公网安备 33010602011771号