bzoj 2159 Crash 的文明世界

2022-04-30 12:51:06 字數 2025 閱讀 9217

crash小朋友最近迷上了一款遊戲——文明5(civilization v)。在這個遊戲中,玩家可以建立和發展自己的國家,通過外交和別的國家交流,或是通過戰爭征服別的國家。現在crash已經擁有了乙個n個城市的國家,這些城市之間通過道路相連。由於建設道路是有花費的,因此crash只修建了n-1條道路連線這些城市,不過可以保證任意兩個城市都有路徑相通。在遊戲中,crash需要選擇乙個城市作為他的國家的首都,選擇首都需要考慮很多指標,有乙個指標是這樣的:$s(i)=\sum _^ndist(i,j)^k$。其中s(i)表示第i 個城市的指標值,dist(i, j)表示第i個城市到第j個城市需要經過的道路條數的最小值,k為乙個常數且為正整數。因此crash交給你乙個簡單的任務:給出城市之間的道路,對於每個城市,輸出這個城市的指標值,由於指標值可能會很大,所以你只需要輸出這個數 mod 10007 的值。

輸入的第一行包括兩個正整數n和k。下面有n-1行,每行兩個正整數u、v (1 ≤ u, v ≤ n),表示第u個城市和第v個城市之間有道路相連。這些道路保證能符合題目的要求。

輸出共n行,每行乙個正整數,第i行的正整數表示第i個城市的指標值 mod 10007 的值。

用結論來化簡式子:$x^n=\sum _^n s(n,i)\cdot f(x,i)$

$s(n,i)$為第二類斯特林數,$f(x,i)=\frac$

可得:$$\begin ans(i)&=\sum _^ndist(i,j)^m\\ &=\sum_^\sum_^s(m,k)\cdot f(dist(i,j),k)\\ &=\sum_^s(m,k)\sum_^ f(dist(i,j),k)\\ &=\sum_^s(m,k)\cdot k!\cdot \sum_^ c(dist(i,j),k) \end$$

根據組合數遞推公式:$c(n,m)=c(n-1,m)+c(n-1,m-1)$ 就可以很方便的對後面的部分進行樹形dp了。

具體地,令 $up(x,i)$ 為不在 $x$ 的子樹中的部分的貢獻,令 $dn(x,i)$ 為 $x$ 的子樹的貢獻。特別的,$dn(x,0)=1$。

詳見**。

1 #include2 #include3 #include4

#define ll long long

5using

namespace

std;

6const

int n=5e4+5;7

const

int m=155;8

const

int mod=1e4+7;9

intn,m,u,v,cnt,ans,tmp;

10int

first[n],fac[m],s[m][m];

11int

up[n][m],dn[n][m];

12struct edgee[n*2

];13

intread()

1417

while(c>='

0'&&c<='9')

18return x*f;19}

20void ins(int u,int v);first[u]=cnt;}

21void mod(int& a,int b)

22void dfs1(int x,int

fa)2334}

35void dfs2(int x,int

fa)3648}

49for(int i=first[x];i;i=e[i].next)

50if(e[i].to!=fa)dfs2(e[i].to,x);51}

52int

main()

5364

//n=read();m=read();

65//

for(int i=1;i66

//70 fac[0]=s[0][0]=1;71

for(int i=1;i<=m;i++)

7277 dfs1(1,-1);dfs2(1,-1

);78

for(int i=1;i<=n;i++)

7985

return0;

86 }

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