概述
题目
传送门 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)i⋅i!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)=ex−j=1∏n⎝⎛eajx−i=0∑Bj−1(aj)i⋅i!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=0Bj−1i!(ajx)i 就是常数了呗!而 e x e^x ex 看成自变量,式子里的 e a j x − G j ( x ) e^{a_j x}-G_j(x) eajx−Gj(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=0∑∑AHi(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!ip⋅xp+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
1−x1=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∑+∞xp⋅p!(p+j)!=j!×(1−x1)j+1
把 x = i x=i x=i 代入,就是贡献。于是 O ( n 2 ) mathcal O(n^2) O(n2) 就能统计答案。这题就做完了。
最后
以上就是幽默月饼为你收集整理的[AGC038E]Gachapon题目思路的全部内容,希望文章能够帮你解决[AGC038E]Gachapon题目思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复