BZOJ2159 Crash的文明世界

2022-08-19 22:51:16 字數 2199 閱讀 5630

description

傳送門給你乙個n個點的樹,邊權為1. 對於每個點u, 求:\(\sum_^ distance(u, i)^\)

$ n \leq 50000, k \leq 150 $

solution

咱們化一下式子:

\(\sum_^ distance(u,i) ^ \)

\(=\sum_^ \sum_^ c(dis(u, i), j)* s2(k, j) * j!\)

\(=\sum_^ s2(k,j) * j! * \sum_^ c(dis(u, i), j)\)

令\(dp[u][j] = \sum_^ c(dis(u, i), j)\)

那麼設$down[u][j] $ 表示\(i \in subtree[u]\)的解, \(up[u][j]\)表示$ i \in tree - subtree[u]$的解

那麼顯然, 根據組合數性質:$$ = + $$

\[down[u][j] = down[son][j - 1] + down[son][j]

\]\[up[x][k]=up[x][k]+up[fa][k]+up[fa][k-1]

\]\[up[x][k]=up[x][k]+down[fa][k]+down[fa][k-1]

\]\[up[x][k]=up[x][k]-down[x][k]-down[x][k-1]

\]\[up[x][k]=up[x][k]-down[x][k-1]-down[x][k-2]

\]codes

#includeusing namespace std;

#define rep(i, a, b) for(int i = (a), i##_end_ = (b); i <= i##_end_; ++i)

#define drep(i, a, b) for(int i = (a), i##_end_ = (b); i >= i##_end_; --i)

#define clar(a, b) memset((a), (b), sizeof(a))

#define debug(...) fprintf(stderr, __va_args__)

#define debug(s) debug("the massage in line %d, function %s: %s\n", __line__, __function__, s)

typedef long long ll;

typedef long double ld;

const int buf_size = (int)1e6 + 10;

struct fastio

inline char getchar()

inline void putchar(char ch)

inline int flush()

}io;

#define getchar io.getchar

#define putchar io.putchar

int read()

void write(int x)

void putstring(char s, char endchar = '\n')

#define mod 10007

#define maxn 50009

#define maxk 159

struct edge g[maxn << 1];

int n, k, head[maxn], e, fac[maxn], up[maxn][maxk], down[maxn][maxk], s[maxk][maxk];

namespace init , head[u] = e;

} void main()

s[0][0] = 1;

rep(i, 1, k)

rep(j, 1, i) s[i][j] = (s[i - 1][j - 1] + j * s[i - 1][j]) % mod;

fac[0] = 1;

rep(i, 1, k) fac[i] = fac[i - 1] * i % mod; }}

namespace solve

} }void dfs1(int u, int fa)

dfs1(v, u);

}} }

void main()

rep(i, 1, n) printf("%d\n", s[i] % mod); }}

int main()

BZOJ2159 Crash 的文明世界

這篇寫差分表和斯特林數介紹的不錯 這題就是要計算這個東西 s i j 1n dist i,j ks i j 1nd ist i,j k這個東西很難維護,我們把di st i j k d is t i,j k拆一下s u v kj 0d u,v d u,v j s u v j 0 kd u v d u...

bzoj 2159 Crash 的文明世界

又來做了一次。之前寫得實在是太差了,這次寫好點吧。這裡介紹用斯特林數展開的方法 如果不會的可以先看看這裡 我們知道xn k 0 ns n k k c x,k x n sum ns n,k k c x,k xn k 0n s n,k k c x k 因此,如果想知道答案,其實就是要知道對於每乙個k k...

BZOJ 2159 Crash 的文明世界

記得去年暑假集訓的時候本來想了乙個動態點分的做法的,然後寫道一半因為某些不知名原因就沒寫了,然後就一直放著,然後發現斯特林反演真nm好寫 首先考慮用關於冪的斯特林反演 m n sum m left times i times c m i 套上去就是 ans x sum n dis i,x k sum...