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=
1∑n
(in
)(−1
)i+1
inf
(i)其中 n
i\frac n i
in **於平均每 n
i\frac n i
in 步才會有一粒餵給選中的鴿子。f(i
)f(i)
f(i)
表示的是給 i
ii 只鴿子餵食,有乙個鴿子大於等於 k
kk 時停止的期望步數。
列舉餵給其他鴿子的玉公尺粒數量,概率通過方案數來算
f (i
)=∑j
=0(i
−1)(
k−1)
(j+k
)i(j
+k−1
j)g[
i−1]
[j](
1i)j
+k
f(i)=\sum_^ (j+k)i\binom jg[i-1][j] (\frac 1 i)^
f(i)=j
=0∑(
i−1)
(k−1
)(j
+k)i
(jj+
k−1
)g[i
−1][
j](i
1)j
+k其中 g[i
−1][
j]
g[i-1][j]
g[i−1]
[j] 表示給 i−1
i-1i−
1 只鴿子喂 j
jj 粒,且每只都小於 k
kk 的方案數。這個可以用生成函式算
g [i
−1][
j]=(
∑r=0
k−1x
ii!)
i−1[
j]
g[i-1][j]=(\sum_^ \frac )^[j]
g[i−1]
[j]=
(r=0
∑k−1
i!x
i)i
−1[j
]時間複雜度 o(n
2k
log(n
k)
)o(n^2k\log (nk))
o(n2
klog(n
k))
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
70010
,mod=
998244353
,g=3
;template
<
typename tp>
inline
intgetmin
(tp &x,tp y)
template
<
typename tp>
inline
intgetmax
(tp &x,tp y)
template
<
typename tp>
inline
void
read
(tp &x)
int n,k,n,l,ans,fac[maxn]
,inv[maxn]
,f[55
],g[55]
[maxn]
,rev[maxn]
;int
pls(
int x,
int y)
intdec
(int x,
int y)
intc
(int n,
int m)
intpower
(int x,
int y)
void
ntt(
int*a,
int f)}}
if(f==-1
)}void
init
(int n)
intmain()
for(
int i=
1;i<=n;i++
)printf
("%d\n"
,ans)
;return0;
}
UOJ 449 集訓隊作業2018 喂鴿子
449.集訓隊作業2018 喂鴿子 dp好題 處理前m個,最快吃飽的鴿子期望的時間 根據期望的定義 考慮每個方案數的概率 期望次數 列舉前m個用了x個,概率都是 1 m x em x 而em x 表示往前m個扔了x個期望的總共次數,就是x n m 考慮用了x個的方案數 生成函式egf思想。而出現乙個...
UOJ424 集訓隊作業2018 count
先特判掉 m n 的情況。考慮先確定乙個 f 陣列,然後判定他能否生成乙個好序列。考慮先確定最靠左邊的最大值的位置,此時他大於等於後面的元素,然後嚴格大於前面的元素。不難發現這種確定方式可以固定一組 f 序列,同時,如果這張圖上的最長鏈小於等於 m 那麼這個答案就是合法的。觀察到我們其實只關心長度,...
UOJ424 集訓隊作業2018 count
將序列對應到笛卡爾樹,發現每棵笛卡爾樹只對應一種合法序列。因為在笛卡爾樹上往左走其對應的數至少減 1 往右走不一定減 1 所以這棵笛卡爾樹從根節點往左走的次數要 leqslant m 題目就轉化為了統計有多少棵 n 個節點的合法笛卡爾樹。笛卡爾樹是二叉樹,因為二叉樹和括號序列都可以用卡特蘭數計數,所...