設 \(f(n)\) 表示有 \(n\) 只鴿子,每次等概率選乙隻喂,期望餵飽第一只鴿子的時間,\(f_\) 表示有 \(n\) 只鴿子,已經喂了 \(m\) 次,此時這 \(n\) 只鴿子中沒有鴿子被餵飽的概率。
\[ans = \sum_^n (-1)^ f(i) \\
f(n)=\sum_\sum_f_ (\frac)^\\
=\sum_f_\sum_ (\frac)^
\]注意到有
\[(\dfrac)^n=\sum_ x^i
\]所以
\[f(n)=\sum_f_\sum_ (\frac)^ \\
=\sum_f_(\frac)^
\]題外話:我們要求的實際上是恰有 \(i\) 次分配到這個集合的所有方案裡分配到集合外的概率之和,不太好組合意義理解,如果有大爺會組合意義了教教我啊。
接下來求 \(f_\) ,這裡由於之前沒有考慮分配 \(n\) 中玉公尺的概率,所以在這裡最後乙隻鴿子分配到乙個玉公尺的概率是 \(\frac\) 。
\[f_=\frac[x^i] (\sum_^\frac)^n
\]或者也可以遞推
\[f_ =\sum_^f_\frac
\]這樣做複雜度是 \(\mathcal o(n^2klog(nk))\) 的,還有複雜度為 \(\mathcal o(n^2k)\) 的高妙做法,以後再補。
code
/*program by mangoyang*/
#include #define inf (0x7f7f7f7f)
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template inline void read(t &x)
const int n = 55, k = 1005, mod = 998244353, g = 3;
int f[n][1<<17], js[1<<17], a[1<<17], inv[1<<17], n, k, ans;
inline void up(int &x, int y)
inline int pow(int a, int b)
namespace poly
inline void dft(int *a, int sgn)}}
if(sgn == -1)
}}inline int c(int x, int y)
int main()
f[0][0] = 1;
for(int i = 1; i <= n; i++)
poly::timesinit(i * k);
poly::dft(f[i-1], 1), poly::dft(a, 1);
for(int j = 0; j < poly::len; j++)
f[i][j] = 1ll * f[i-1][j] * a[j] % mod;
poly::dft(f[i], -1);
for(int j = 0; j < poly::len; j++) a[j] = 0;
for(int j = i * (k - 1) + 1; j < poly::len; j++) f[i][j] = 0;
for(int j = 0; j <= i * (k - 1); j++)
} cout << ans << endl;
return 0;
}
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...
UOJ 449 集訓隊作業2018 喂鴿子
449.集訓隊作業2018 喂鴿子 dp好題 處理前m個,最快吃飽的鴿子期望的時間 根據期望的定義 考慮每個方案數的概率 期望次數 列舉前m個用了x個,概率都是 1 m x em x 而em x 表示往前m個扔了x個期望的總共次數,就是x n m 考慮用了x個的方案數 生成函式egf思想。而出現乙個...
集訓隊作業2018 小Z的禮物
小水題。題意就是不斷隨機放乙個 1 times 2 骨牌,然後取走裡面的東西。求期望多少次取走所有的東西。然後有一維很小。首先顯然 minmax 容斥,將最後取走轉化為欽定一些物品,求第乙個取走的期望。然後顯然第乙個取走的期望只和剩下能蓋到物品的骨牌數有關。乙個骨牌能蓋到物品只和相鄰的兩個格仔是否欽...