题解 P5828 【边双连通图计数】
前置技能:无向连通图计数
设有标号无向图的 egf 为
边双连通图
首先设有根连通无向图的指数生成函数是
设
代入可得
我们可以在
//多项式模板略去
void init()
{
F.resize(n+1);
for(int i=0;i<F.size();++i)F[i]=power(2,(ll)i*(i-1)/2%(mod-1),ifac[i]);
D=Ln(F);
for(int i=0;i<D.size();++i)Mul(D[i],i);
G=Deriv(D);
}
// B(x)->有根边双
// D(x)=B(xexp(D(x)))
// [x^n]B(x) = \frac{1}{n}[x^{n-1}]D'(x) (1/exp(D))^n
int calc(int n)
{
Poly C(D.begin(),D.begin()+n),L(G.begin(),G.begin()+n);
for(int i=0;i<C.size();++i)Mul(C[i],mod-n);
C=Exp(C)*L;
return mul(inv[n],C[n-1]);
}
int main()
{
init();
scanf("%d",&n);
ans=(ll)calc(n)*fac[n-1]%mod; //n!是因为egf, 除去n是因为有根
printf("%d\n",ans);
}