[AGC038E]Gachapon

280 篇文章 1 订阅

题目

传送门 to AtCoder

题目概要
每一步以 A i ∑ j = 1 n A j {A_i\over \sum_{j=1}^{n}A_j} j=1nAjAi 的概率获得数字 i i i 。当某一个时刻对 ∀ i \forall i i 满足,数字 i i i 至少有 B i B_i Bi 个时,游戏结束。求步数的期望。

数据范围与提示
max ⁡ ( n , ∑ i = 1 n A i , ∑ i = 1 n B i ) ≤ 400 \max(n,\sum_{i=1}^{n}A_i,\sum_{i=1}^{n}B_i)\le 400 max(n,i=1nAi,i=1nBi)400

思路

上来直接搞 生成函数。但是为什么会想到这个呢?或许是 ∑ B \sum B B 这种奇怪限制的提示吧。

生成函数 F ( x ) F(x) F(x) 的第 k k k 项的系数为,选择了 k k k 个数 仍然未结束 的概率。这个操作很常见,因为在此种情形下, F ( x ) F(x) F(x) 系数之和即为期望。因为操作步数 s s s 可以看成 ∑ i = 0 + ∞ [ i < s ] \sum_{i=0}^{+\infty}[i<s] i=0+[i<s] ,而 i < s i<s i<s 等价于仍然未结束。这样就分摊下来了。

考虑用 1 1 1 减去已经结束的概率。由于我们要算一个很像组合的东西——每个数字都选了至少 B i B_i Bi 个——所以指数型母函数恰好可以搞定它。为了方便,姑且用 a j a_j aj 直接表示概率;实际上,为了让指数为整数,我们要把所有指数都乘 ∑ i = 1 n A i \sum_{i=1}^{n}A_i i=1nAi
e a j x = ∑ i = 0 + ∞ ( a j x ) i i ! = ∑ i = 0 + ∞ ( a j ) i ⋅ x i i ! e^{a_jx}=\sum_{i=0}^{+\infty}\frac{(a_jx)^i}{i!}=\sum_{i=0}^{+\infty}(a_j)^i\cdot \frac{x^i}{i!} eajx=i=0+i!(ajx)i=i=0+(aj)ii!xi

这是第 j j j 个数字任意选的生成函数。那么我们要选择至少 B j B_j Bj 个,去掉前面那些选择就行。所以
F ( x ) = e x − ∏ j = 1 n ( e a j x − ∑ i = 0 B j − 1 ( a j ) i ⋅ x i i ! ) F(x)=e^x-\prod_{j=1}^{n}\left(e^{a_jx}-\sum_{i=0}^{B_j-1}(a_j)^i\cdot\frac{x^i}{i!}\right) F(x)=exj=1neajxi=0Bj1(aj)ii!xi

然后呢?你 假装 x = 1 x=1 x=1 嘛!此时 G j ( x ) = ∑ i = 0 B j − 1 ( a j x ) i i ! G_j(x)=\sum_{i=0}^{B_j-1}{(a_jx)^i\over i!} Gj(x)=i=0Bj1i!(ajx)i 就是常数了呗!而 e x e^x ex 看成自变量,式子里的 e a j x − G j ( x ) e^{a_j x}-G_j(x) eajxGj(x) 就相当于一个 关于 e x e^x ex a j a_j aj 次多项式。反正 G j ( x ) G_j(x) Gj(x) 是四则运算样样精通,只是一次计算需要 O ( ∑ B ) \mathcal O(\sum B) O(B) 的时间罢了。把 n n n 个这玩意儿乘起来,需要 O ( n 3 ) \mathcal O(n^3) O(n3)(这里 ∑ A \sum A A ∑ B \sum B B 两项都用 n n n 进行了替代)。

如果上面这一段不太懂,那你再看看这个:最终我们必定求出
F ( x ) = ∑ i = 0 ∑ A H i ( x ) ⋅ ( e x ) i F(x)=\sum_{i=0}^{\sum A}H_i(x)\cdot (e^x)^i F(x)=i=0AHi(x)(ex)i

这里 H i ( x ) H_i(x) Hi(x) 是最多 ∑ B \sum B B 次的多项式。这下你明白了 e x e^x ex 当做自变量的意思了吧?

然后呢?答案是什么呢?显然是 F ( x ) F(x) F(x) 的系数求和。那我们来看一看, H i ( x ) ⋅ ( e x ) i H_i(x)\cdot(e^x)^i Hi(x)(ex)i 会提供怎么样的贡献呢?由于 H i ( x ) H_i(x) Hi(x) 是含 x x x 的,要影响结果,我们把 H i ( x ) H_i(x) Hi(x) 中的某一项 c j x j c_j x^j cjxj 拿出来,和 ( e x ) i (e^x)^i (ex)i 乘起来:
c j x j ⋅ ( e x ) i = c j ∑ p = 0 + ∞ i p p ! ⋅ x p + j c_jx^j\cdot (e^x)^i=c_j\sum_{p=0}^{+\infty}{i^p\over p!}\cdot x^{p+j} cjxj(ex)i=cjp=0+p!ipxp+j

右边那货不是贡献,因为 F ( x ) F(x) F(x) 的系数不包含阶乘。换句话说,我们求的是 x p p ! {x^p\over p!} p!xp 的系数。所以它的贡献是
c j ∑ p = 0 + ∞ i p ⋅ ( p + j ) ! p ! c_j\sum_{p=0}^{+\infty}{i^p\cdot (p+j)!\over p!} cjp=0+p!ip(p+j)!

只要求出这玩意儿,万事大吉。哦豁,它是无穷级数!但是这有什么好害怕的呢?通用方法:转化为导数。因为 1 1 − x = 1 + x + x 2 + ⋯ {1\over 1-x}=1+x+x^2+\cdots 1x1=1+x+x2+,所以其 j j j 阶导为
∑ p = 0 + ∞ x p ⋅ ( p + j ) ! p ! = j ! × ( 1 1 − x ) j + 1 \sum_{p=0}^{+\infty}x^p\cdot\frac{(p+j)!}{p!}=j!\times\left(\frac{1}{1-x}\right)^{j+1} p=0+xpp!(p+j)!=j!×(1x1)j+1

x = i x=i x=i 代入,就是贡献。于是 O ( n 2 ) \mathcal O(n^2) O(n2) 就能统计答案。这题就做完了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值