BZOJ 2159 Crash 的文明世界

2022-04-02 22:25:28 字數 1570 閱讀 1199

記得去年暑假集訓的時候本來想了乙個動態點分的做法的,然後寫道一半因為某些不知名原因就沒寫了,然後就一直放著,然後發現斯特林反演真nm好寫

首先考慮用關於冪的斯特林反演:

\[m^n=\sum_^m \left\\times i!\times c_m^i

\]套上去就是:

\[ans(x)=\sum_^n dis(i,x)^k

\]\[=\sum_^n \sum_^k \left\\times c_^j\times j!

\]\[=\sum_^k \left\\times j!\times \sum_^n c_^j

\]顯然我們現在只要知道\(\sum_^n c_^j\)怎麼求即可,設:

\[dn_=\sum_ c_^i

\]\[up_=\sum_ c_^i

\]其中\(y\in x\)表示\(y\)在\(x\)子樹內

顯然我們可以推出關於\(dn\)的方程:

\[dn_=\sum_ c_^i

\]\[=[i=0]+\sum_\sum_ c_^i

\]\[=[i=0]+\sum_\sum_ c_^i+c_^

\]\[=[i=0]+\sum_ dn_+dn_

\]那麼接下來就是\(up\)的,如果熟悉換根dp那一套的話會很容易推出來,注意要容斥掉一部分:

\[up_=\sum_ c_^i

\]\[=\sum_ c_^i+\sum_ c_^i-\sum_ c_^i

\]\[=up_+up_+dn_+dn_-dn_-2\times dn_-dn_

\]邊界就是\(up_=0\)

然後就做完了,複雜度\(o(nk)\)

ps:bzoj上又要改輸入又會莫名掛掉,因此下面的**是luogu上的同題的

#include#define ri register int

#define ci const int&

using namespace std;

const int n=500005,m=155,mod=10007;

struct edge

e[n<<1]; int n,head[n],cnt,k,x,y,fact[n],s[m][m],up[n][m],dn[n][m],ans;

inline void addedge(ci x,ci y)

; head[x]=cnt;

e[++cnt]=(edge); head[y]=cnt;

}inline int fix(int x)

inline void init(ci n)

#define to e[i].to

inline void dfs1(ci now=1,ci fa=0)

inline void dfs2(ci now=1,ci fa=0)

for (i=head[now];i;i=e[i].nxt) if (to!=fa) dfs2(to,now);

}#undef to

int main()

return 0;

}

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 的文明世界

crash小朋友最近迷上了一款遊戲 文明5 civilization v 在這個遊戲中,玩家可以建立和發展自己的國家,通過外交和別的國家交流,或是通過戰爭征服別的國家。現在crash已經擁有了乙個n個城市的國家,這些城市之間通過道路相連。由於建設道路是有花費的,因此crash只修建了n 1條道路連線...