cojs 二分图计数问题1-3 题解报告
OwO 良心的FFT练手题,包含了所有的多项式基本运算呢
其中一部分解法参考了myy的uoj的blog
二分图计数 1:
实际是求所有图的二分图染色方案和
我们不妨枚举这个图中有多少个黑点
在n个点中选出k个黑点的方案为C(n,k)
白点和黑点之间任意连边,方案为2^(k*(n-k))
所以得到f(n)=sigma(C(n,k)*2^(k*(n-k))
由于本题只需要求解一个f(n),枚举并计算就可以了
更高端一点的做法是这样的:
我们可以利用在<DAG计数问题 题解报告>中提到的技巧将n*k拆开
即n*k=n^2/2+k^2/2-(n-k)^2/2
这样我们会得到一个可以FFT的形式,之后做一遍FFT就可以求出1-n的所有f值了
二分图计数 2:
实际是求所有图中二分图的个数
设一个二分图有k个联通块,那么对于染色方案数的贡献就是2^k
设n个点的二分图的生成函数为多项式g,上一个问题的生成函数为多项式f
由于k个联通块的子集有2^k个,所以不难发现存在g^2=f
因为任意一个二分图都会在卷积的过程中被重复计算2^k次
这样我们就得到g=sqrt(f) 多项式开根即可
二分图计数 3:
实际是求所有图中联通二分图的个数
设n个点的联通二分图的生成函数为h
由于二分图是由若干个联通二分图组成的
所以得到e^h=g,变形得h=ln(g),多项式求ln即可
考虑一种更好的做法
我们定义n个点的联通二分图的染色方案总数为多项式t
显然h=t/2,问题转化成如何求t
同理我们可以得到e^t=f,变形得t=ln(f),那么我们对f做多项式求ln之后把系数除以2即可
所以进而我们也可以得到<二分图计数 2>的另一种做法
就是利用上面的方法求出h之后做多项式求exp就可以求解出g了