BZOJ2159 Crash 的文明世界

2021-08-18 08:39:57 字數 2137 閱讀 2929

這篇寫差分表和斯特林數介紹的不錯

這題就是要計算這個東西 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條道路連線...