我是靠谱客的博主 幽默月饼,最近开发中收集的这篇文章主要介绍[AGC038E]Gachapon题目思路,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目

传送门 to AtCoder

题目概要
每一步以 A i ∑ j = 1 n A j {A_iover 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)^icdot 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)^icdotfrac{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)^iover 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^jcdot (e^x)^i=c_jsum_{p=0}^{+infty}{i^pover p!}cdot x^{p+j} cjxj(ex)i=cjp=0+p!ipxp+j

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

只要求出这玩意儿,万事大吉。哦豁,它是无穷级数!但是这有什么好害怕的呢?通用方法:转化为导数。因为 1 1 − x = 1 + x + x 2 + ⋯ {1over 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^pcdotfrac{(p+j)!}{p!}=j!timesleft(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) 就能统计答案。这题就做完了。

最后

以上就是幽默月饼为你收集整理的[AGC038E]Gachapon题目思路的全部内容,希望文章能够帮你解决[AGC038E]Gachapon题目思路所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部