題目大意:
對每個點$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 #includeview code11#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 }
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...