BZOJ 3456 城市規劃

2022-08-21 02:33:10 字數 3567 閱讀 2743

有標號集合計數

對於 \(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 最後...