題目大意:求$n$個點的帶標號的無向連通圖的個數
題解:令$f(x)$為帶標號無向連通圖個數生成函式,$g(x)$為帶標號無向圖個數生成函式
那麼$g(x) = \sum_^ \dfrac} x^i$
列舉連通塊個數可得$g(x)=\sum_^\dfrac$
$$f(x)=f(x_0)+\dfrac+\dfrac+\cdots+\dfrac(x_0)(x-x_0)^n}\\
f(x)=e^x, x_0=0\\
e^x=\sum\limits_^\dfrac
$$由泰勒展開得$g(x)=e^$
所以$f(x) = \ln g(x)$
$$f(x)=\ln g(x)\\
f'(x)=\dfrac\\
f(x)=\int\dfrac\mathrm
$$答案是$[x^n]f(x) \times n!$
卡點:無
c++ code:
#include #include #define maxn 262144 + 10const int mod = 1004535809, g = 3;
int n;
int g[maxn], f[maxn], fac[maxn], inv[maxn];
inline int pw(int base, long long p)
inline int inv(int x)
namespace polynomial
inline void up(int &a, int b)
inline void ntt(int *a, int op)
}} if (!op) for (int i = 0; i < lim; i++) a[i] = 1ll * a[i] * ilim % mod;
} void inv(int *a, int *b, int n)
inv(a, b, n + 1 >> 1), init(n << 1);
for (int i = 0; i < n; i++) c[i] = a[i];
for (int i = n; i < lim; i++) c[i] = b[i] = 0;
ntt(b, 1), ntt(c, 1);
for (int i = 0; i < lim; i++) b[i] = (2 + mod - 1ll * b[i] * c[i] % mod) * b[i] % mod;
ntt(b, 0);
for (int i = n; i < lim; i++) b[i] = 0;
} inline void der(int *a, int *b, int n)
inline void int(int *a, int *b, int n)
int d[maxn];
inline void ln(int *a, int *b, int len)
}int main()
for (int i = 2; i < n; i++) inv[i] = 1ll * inv[i - 1] * inv[i] % mod;
for (int i = 0; i < n; i++) g[i] = 1ll * pw(2, 1ll * i * (i - 1) >> 1ll) * inv[i] % mod;
polynomial::ln(g, f, n);
printf("%lld\n", 1ll * f[n - 1] * fac[n - 1] % mod);
return 0;
}
洛谷 P4841 城市規劃 解題報告
n個有標號點的簡單 無重邊無自環 無向連通圖數目.僅一行乙個整數 n le 130000 僅一行乙個整數,為方案數 bmod 1004535809 設 g i 表示 i 個點的圖的數目,f i 表示 i 個點聯通圖的個數 g n f n sum f i binomg 意義是聯通圖 非聯通圖,關於非聯...
洛谷4841 城市規劃
題意 求 n 個點的簡單 無重邊無自環 有標號無向連通圖數目。思路 設 f n 為點數為 n 的無向連通圖的數量,g n 為點數為 n 的無向圖的數量,可以知道 g n 2 可以這麼理解,n 個點中取兩個點連邊,一共有 c n 2 種,每個邊存在連或不連兩種可能。同時有 g n sum nc f i...
P4841 集訓隊作業2013 城市規劃
設 f i 表示 i 個點的無向連通圖個數,g i 表示 i 個點的無向圖個數。列舉 1 所在連通塊的大小,有 g i sum limits ic f jg 化簡得 g i sum limits i fracf jg frac sum limits i frac frac 設 f i frac,g ...