這篇寫差分表和斯特林數介紹的不錯
這題就是要計算這個東西 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
,v)−
j)!s(
u)=∑
v∑kj
=0j!
(d(u
,v)j
) s(u
)=∑v
∑j=0
kj!(
jd(u
,v))
s(u)=∑
kj=0
j!∑v
(d(u
,v)j
) s(u
)=∑j
=0kj
!∑v(
jd(u
,v))
令f[u][j]表示u得子樹內的∑v
(d(u
,v)j
) ∑v(
jd(u
,v))
,因為(i
j)=(
i−1j
)+(i
−1j−
1)( ji
)=(j
i−1)
+(j−
1i−1
),可以用f[v][j-1]+f[v][j]轉移到f[u][j]這樣轉移
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int mod = 10007;
const
int maxn = 51000;
const
int maxk = 210;
inline
void add(int &a,const
int &b)
inline
void dec(int &a,const
int &b)
int s[maxk],str[maxk][maxk];
void pre()
}int n,k;
struct edgea[maxn<<1]; int len,fir[maxn];
inline
void ins(const
int x,const
int y);fir[x]=len;}
void read()
/*scanf("%d%d",&n,&k);
for(int i=1;i}
int f[maxn][maxk],g[maxn][maxk];
int temp[maxk];
int fa[maxn];
void dpf(const
int x)
}void dpg(const
int x)
for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa[x])
dpg(y);
}void print()
}int main()
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...
bzoj 2159 Crash 的文明世界
crash小朋友最近迷上了一款遊戲 文明5 civilization v 在這個遊戲中,玩家可以建立和發展自己的國家,通過外交和別的國家交流,或是通過戰爭征服別的國家。現在crash已經擁有了乙個n個城市的國家,這些城市之間通過道路相連。由於建設道路是有花費的,因此crash只修建了n 1條道路連線...