将容斥系数隐含在式子中的方法

本文设f~表示生成函数f的指数生成函数。

给定一个数n,以及权值为1,2,,nn个点,对于t=1,2,,n,设z=,求满足z=t的无向图个数。n5105

最大值为t不好直接考虑,先来一波前缀和,求zt的无向图个数。那么就是要求所有权值>t的点不能单组组成连通块。应用一般的容斥方法,统计包含某k个特定的仅由权值>t的点构成的连通块(称为非法连通块)作为子集的方案,这个方案的贡献是(1)k。因为对于一个恰好含有s个非法连通块的方案,它的贡献是k=0s(1)k(sk)=[s=0]

那么,对于特定的t,要统计zt的无向图个数,可以先枚举之前所述的k,再枚举这k个非法连通块的总点数i,用和exp类似的方法统计总数。则可以写成:

k=0nt(1)k(i=0nt(nti)gni1k!((s=0k1as)=i,asN(ia0,a1,,ak1)(i=0k1fai)))

其中f表示n个点组成的无向连通图的方案数的生成函数,g表示n个点组成的无向图的方案数的生成函数。进一步转化式子:

k=0nt(1)kk!(i=0nt(nti)i!gni((s=0k1as)=i,asN(i=0k1faiai!)))k=0nt(1)kk!(i=0nt(nti)i!gni(f~k)i)i=0nt(nti)i!gni(k=0nt(f~)kk!)i()i=0nt(nti)i!gni(ef~)i

我们考虑ef~=g~,因此ef~=1g~,因此原式可转化为:

i=0nt(nti)i!gni(1g~)i(nt)!i=0ntgni(1g~)i1(nti)!

显然g可以直接求出,再利用多项式求逆求出1g~,并令hi=gni(1g~)i,则原式可转化为卷积形式,FFT计算即可。

本题不需要什么黑科技只要求逆就好了,真是清真呢。

回顾一下,之前的推导最终转化成了()式这样简单的形式,可以思考一下这一式子是否有直接的组合意义。该式的意义就在于,之前所说的容斥系数在这里并没有显式的表现出来,而是隐含在了ef~的系数中。将容斥系数隐含在式子中后,我们可以在外层直接枚举与容斥系数没有直接关系的i,也就是非法连通块的总点数,从而自动达到容斥的目的。这样的将容斥系数拆解到式子中的方法在一些组合计数问题中有时会出现,比如CTS2019的最后一题。

当然,正如之前的推导所示,思路比较直接的方法在本题也能得到同样的结果。不过,如果在做组合计数时有意识的利用该方法变形,也可以大大简化思路,甚至做到直接推导很难得到的结果。

本题是我以前和一个现在已经是集训队大佬的假雪菜同学一起原创的,但这股套路的气息让我感觉它说不定已经在哪里出现过了。无论如何,如果这篇文章对还未退役的你有帮助的话,也不枉我这只退役狗在午休的时间狂码了。不过,写这篇文章主要还是因为我比较享受这个过程本身呢~