有標號集合計數
對於 \(a\) 中元素形成的集合的指數型生成函式 egf 為 $$b(x)=\sum_\frac=e$$
現在設 \(g\) 為所有簡單無向圖,則 \(g\) 的 egf 為 $$g(x)=\sum_2}\frac$$
而 \(c\) 為簡單無向連通圖,連通圖可以看成若干個連通分量組成的集合,也就是 $$g(x)=e^$$
那麼 $$c(x) = \ln g(x)$$
多項式取對數即可
#include using namespace std;
typedef long long ll;
typedef double db;
const int mod = 1004535809, inv2 = (mod + 1) / 2;
const int n = 1 << 20;
int inv[n];
inline void m(int &x)
inline int mul_mod(int x, int y)
inline int qp(int a, int n = mod - 2)
return ret;
}namespace fft
complex operator!() const
complex operator+(const complex &b) const
complex operator-(const complex &b) const
complex operator*(const complex &b) const
complex& operator+=(const complex &b)
complex& operator*=(const complex &b)
complex& operator/=(db d)
};int base = 1;
int rev[n] = ;
complex roots[n] = , };
inline void ensure_base(int nbase)
}} inline void _fft(complex a, int n, bool isinv = false) }}
if (isinv) for (int i = 0; i < n; ++i) a[i] /= n;
} inline int get_n(int x)
complex pa[n], pb[n], tem[n];
inline void mul_force(int a, int len_a, int b, int len_b, int res)
}if (sum == tempsum) memcpy(res, sum, sizeof(int)*tot);
} inline void convo(int a, int len_a, int b, int len_b, int res)
int tot = len_a + len_b - 1, n = get_n(tot);
for (int i = 0; i < len_a; ++i)
pa[i] = complex(a[i] / m0, a[i] % m0);
memset(pa + len_a, 0, sizeof(complex) * (n - len_a));
_fft(pa, n);
if (a == b && len_a == len_b) else
tem[0] = complex(pa[0].im * pb[0].im, 0);
for (int i = 1; i < n; ++i)
(tem[i] = (pa[i] - !pa[n - i]) * (pb[i] - !pb[n - i])) /= -4; // tem = fra*frb
for (int i = 0; i < n; ++i)
(pa[i] *= pb[i]) += tem[i];
_fft(pa, n, true), _fft(tem, n, true);// idft(fka*fkb + i(fra*fkb + fka*frb))、idft(fra*frb)
for (int i = 0; i < tot; ++i)
res[i] = (toll(pa[i].re) * m0 * m0 + toll(pa[i].im) * m0 + toll(tem[i].re)) % mod;
} void poly_inv(int a, int b, int n)
static int res[n];
int hn = (n + 1) >> 1;
poly_inv(a, b, hn);
convo(b, hn, b, hn, res);
convo(a, n, res, hn * 2 - 1, res);
for (int i = hn; i < n; ++i) b[i] = res[i] == 0 ? 0 : mod - res[i];
} void poly_sqr(int *a, int *b, int n)
for (int i = 0; i < len; i++) a[i] = b[i] = 0;
for (int i = n; i < len; i++) b[i] = 0;
} void int(int *a, int *b, int n)
void diff(int *a, int *b, int n)
void poly_ln(int *a, int *b, int n)
void poly_exp(int *a, int *b, int n)
for (int i = 0; i < n; i++)
b[i] = d[i];
} void poly_pow(int *a, int *b, int n, int k)
void poly_pow(int *a, int *b, int n, int k)
static int c[n];
//memset(b, 0, sizeof(int) * n);
if (1ll * k * d >= n) return;
int fi = a[d], invv = qp(fi);
for (int i = 0; i < n - d; i++)
b[i] = 1ll * a[i + d] * invv % mod;
poly_pow(b, c, n, k);
for (int i = 0; i < k * d; i++)
b[i] = 0;
int p = qp(fi, k);
for (int i = k * d; i < n; i++)
b[i] = 1ll * c[i - k * d] * p % mod;
}}int c(int n)
int fac[n], fac_inv[n], a[n], b[n];
int main()
fft::poly_ln(a, b, n + 1);
printf("%lld\n", 1ll * b[n] * fac[n] % mod);
return 0;
}
bzoj 3456 城市規劃
題意 求n個點的無向連通圖個數 n個點不同,答案對1004535809取模 n 130000 題解 生成函式的種種神奇應用 不過這玩意真是越來越不oi了 笑 這道題首先考慮遞推公式 設f x 為結點數為x的答案 那麼用總的無向圖數減去不連通的無向圖數目就是答案 f i 2 i i 1 2 f j 2...
bzoj3456 城市規劃
time limit 40 sec memory limit 256 mb submit 342 solved 204 submit status discuss 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整...
bzoj 3456 城市規劃
好像歐爺很久以前就考過這道題了,然而我這個幼兒園小同學到現在才寫 懶得寫題解了,寫完後找幾份好點的題解搬了 求 n 個點無標號簡單無向連通圖個數。方法1那個所謂的 麥克勞林級數 說得有點高階。其實那個式子就是指數生成函式,然後根據某些特性 當然我不會證 指數生成函式可以表示成 e 的冪。方法2 最後...