#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 個節點的合法笛卡爾樹。笛卡爾樹是二叉樹,因為二叉樹和括號序列都可以用卡特蘭數計數,所...