UOJ 449 集訓隊作業2018 喂鴿子

2022-02-04 18:11:59 字數 2505 閱讀 8911

#449. 【集訓隊作業2018】喂鴿子

dp好題

處理前m個,最快吃飽的鴿子期望的時間

根據期望的定義

考慮每個方案數的概率*期望次數

列舉前m個用了x個,概率都是(1/m)^x*em(x)

而em(x)表示往前m個扔了x個期望的總共次數,就是x*n/m

考慮用了x個的方案數

生成函式egf思想。

而出現乙個有k次就會停止。最後乙個位置一定會使得乙個鴿子飽了。

f[i][j]前i個,總共用了j個,沒有乙個有k次的方案數

g[i][j],。。。。。。。。有乙個有k次的方案數

ntt優化轉移。

f和1/k!的項乘出來的貢獻加到g裡去即可。

神仙思路

只考慮「有實質變化」的玉公尺,即餵給了乙個沒有飽的鴿子的玉公尺

還是考慮每個「有效玉公尺序列」的貢獻,就是出現概率*期望

乙個固定的「有效玉公尺序列」,出現概率和期望都和每次扔玉公尺時已經飽的鴿子有關係

所以狀態多記錄上飽的鴿子數量

至於怎樣判斷乙個鴿子飽了

先填「白色」有效玉公尺,

想讓乙個鴿子飽了,就欽定之前k-1個白玉公尺染上色!

所以這個白玉公尺還是「對未來承諾」,或者對未來預留的trick

狀態保留貢獻和和概率和即可。是可以轉移的。

複雜度:o(n^2k)

#include#define reg register int

#define il inline

#define fi first

#define se second

#define mk(a,b) make_pair(a,b)

#define numb (ch^'0')

#define pb push_back

#define solid const auto &

#define enter cout

namespace

std;

typedef

long

long

ll;template

il void rd(t &x)

template

il void output(t x)

template

il void ot(t x)

template

il void prt(t a,int st,int nd)

namespace

modulo

void inc(int &x,int y)

int mul(int x,int y)

void inc2(int &x,int y)

int qm(int x,int y=mod-2)return

ret;}

template

il int ad(const

int a,const

int b,const args &...args)

template

il int mul(const

int a,const

int b,const args &...args)

}using

namespace

modulo;

namespace

miracle

intn,k;

intmain()

inv[lim]=qm(jie[lim]);

for(reg i=lim-1;i>=0;--i) inv[i]=mul(inv[i+1],i+1

); g[

0][0]=1

;

for(reg m=0;mm)

}ll ans=mul(f[lim][n],jie[n]);

ot(ans);

return0;

}}signed main()

/*author: *miracle*

*/

兩種方法的共同之處是:

都從統計每個合法方案的出現概率和期望次數統計

考慮「有變化」的玉公尺

根據需要進行dp設計

第一種方法:是min-max容斥的套路。難點轉化為合法的方案數。egf思想,dp+ntt優化

第二種方法:直接考慮「有效玉公尺序列」,發現概率只和之前飽的鴿子有關而進行狀態設計。

然鵝並不知道乙個鴿子飽不飽,所以不能立刻決定當前玉公尺餵給誰。所以利用「白玉公尺」,最後統一染色。

UOJ449 集訓隊作業2018 喂鴿子

uoj 看題後 感覺自己越來越菜了,再這樣下去,要是正式考試送溫暖豈不是連溫暖都拿不到了。一臉min max反演的樣子,由於每個鴿子都等價,列舉子集大小 i ii 即可 a ns i 1n n i 1 i 1nif i ans sum n binom n i 1 frac n i f i ans i...

UOJ424 集訓隊作業2018 count

先特判掉 m n 的情況。考慮先確定乙個 f 陣列,然後判定他能否生成乙個好序列。考慮先確定最靠左邊的最大值的位置,此時他大於等於後面的元素,然後嚴格大於前面的元素。不難發現這種確定方式可以固定一組 f 序列,同時,如果這張圖上的最長鏈小於等於 m 那麼這個答案就是合法的。觀察到我們其實只關心長度,...

UOJ424 集訓隊作業2018 count

將序列對應到笛卡爾樹,發現每棵笛卡爾樹只對應一種合法序列。因為在笛卡爾樹上往左走其對應的數至少減 1 往右走不一定減 1 所以這棵笛卡爾樹從根節點往左走的次數要 leqslant m 題目就轉化為了統計有多少棵 n 個節點的合法笛卡爾樹。笛卡爾樹是二叉樹,因為二叉樹和括號序列都可以用卡特蘭數計數,所...