P5828
zhoukangyang · · 题解
大家的做法都用了拉反,给个不用拉反的做法。
考虑容斥:钦定边集
最终的图一定是若干个联通块由
直接做不好做,因此更换枚举顺序。先枚举连通块(设大小分别为
设有标号连通图的
核心代码:
cin >> n;
poly F (n + 1);
F[0] = 1;
L(i, 1, n) F[i] = (ll) F[i - 1] * qpow (2, i - 1) % mod * inv[i] % mod;
F = F.Ln();
L(i, 1, n) F[i] = mod - (ll) F[i] * i % mod * n % mod;
F = F.Exp();
cout << (ll) (mod - F[n]) * inv[n] % mod * fac[n - 1] % mod << "\n";