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 #include4view code#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 }
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...