bzoj 2159 Crash的文明世界

2022-06-01 02:21:09 字數 1584 閱讀 2130

題目大意:

對每個點$x$ 求$\sum\limits_^ ^k$

思路:首先可以把式子展開得到$dis(i,j)^k=\sum\limits_^k \binom s2(k,t)* t!$ ,$s2$為第二類斯特林數

因此對每個點 我們只需要求出$\sum\limits_^k \sum\limits_^n c_^t $

而組合數有乙個很好的性質$c(n,m)=c(n-1,m)+c(n-1,m-1)$

這樣我們$dp$,$f(x,j)$表示子樹內的$\sum c_^j$按照組合數的性質很容易合併

然後我們再從上面繼承其父親子樹外的點的與子樹一樣,考慮與它同級的其他點,用父親的$f$減去之前用自己轉移出的$fa$即可

即$g(x,i)+=f(fa,i)+f(fa,i-1)-f(x,i)-f(x,i-1)-f(x,i-1)-f(x,i-2)$

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11#define ll long long

12#define db double

13#define inf 2139062143

14#define maxn 50100

15#define mod 10007

16#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)

17#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)

18#define ren for(register int i=fst[x];i;i=nxt[i])

19#define pb(i,x) vec[i].push_back(x)

20#define pls(a,b) (a+b)%mod

21#define mns(a,b) ((a-(b))%mod+mod)%mod

22#define mul(a,b) (1ll*(a)*(b))%mod

23using

namespace

std;

24 inline int

read()

2528

while(isdigit(ch))

29return x*f;30}

31int n,m,l,las,a,b,q,nxt[maxn<<1],to[maxn<<1

],fst[maxn],cnt;

32int s[155][155],fac[155],f[maxn][155],g[maxn][155

];33

void add(int u,int v)

34void dfs(int x,int

pa)3538}

39void dfs(int x,int

pa)40

45int

main()

4651 rep(i,1

,n)52

56 }

view code

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...