【题解】带标号二分图计数

本文中 \(f[i]\) 表示 \([x^i]f(x)\)

带标号的二分图的数量不方便用一个式子直接写出,我们考虑用别的统计去推出它。

我们先求出连通二分图的生成函数,再求任意二分图的生成函数。

二分图想到黑白染色,二分图黑白染色的方案是好得到的:令 \(f(x)\) 表示所有 \(n\) 个点的图的的黑白染色方案之和的生成函数,则有

\[f[n]=\sum_{i=0}^{n} \binom ni\times2^{i(n-i)} \]

稍微转化一下。

\[\dfrac {f[n]} {2^{n^2/2} \times n!}=\sum_{i=0}^{n} \dfrac 1 {i!(n-i)!\times2^{i^2/2}\times2^{(n-i)^2/2}} \]

就是加法卷积的形式了。

当一个二分图连通时,其黑白染色的方案等于 \(2\),所以找到连通二分图的黑白染色的生成函数就形了。

连通图——任意图 是一种典型的“集合——集族”关系,它们的指数生成函数满足以下关系:

其中任意图的指数生成函数为 \(g(x)\),连通图的为 \(f(x)\)

\[\operatorname{Exp}(f(x))=g(x) \]

做一次多项式 \(\operatorname{ln}\) 再对每一项除二得到二分连通图的指数生成函数,再使用“集合——集族”关系 \(\operatorname{Exp}\) 回去即可。

会发现上述过程等价于给 \(g(x)\) 开根,直接开根有更优秀的常数,时间复杂度都是 \(O(n\log n)\)

主要部分(因为我没想到对 \(2\) 的指数做一些很妙的转化,就直接用了二次剩余来处理除二的问题。其中 \(b^2=2\) ):

n=1e5;
rep(i,0,n) f[i] = math::finv[i] * math::Pow(b,(ll)i*i%(mod-1)*(mod-2)) % mod ;
poly::work(n+n);
poly::NTT(f);
poly::pmul(f,f,f);
poly::iNTT(f);
poly::mem(f+n+1,poly::L-n);
rep(i,0,n) f[i]=(ll)f[i] * math::Pow(b,(ll)i*i) % mod;
poly::ln(f,n,g);
poly::nummul(g,n,i2,g);
poly::exp(g,n,f);
rep(i,1,n) wrt(f[i] * math::fac[i] % mod,'\n');

完整代码

posted @ 2023-02-21 16:38  寂静的海底  阅读(75)  评论(0编辑  收藏  举报