本文中 \(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');
标签:标号,二分,连通,函数,poly,计数,math,mod
From: https://www.cnblogs.com/Dreamerkk/p/17141530.html