F 抽奖
考虑枚举每次抽到奖品需要的次数,恰好抽 n 次后中奖的概率就是 (1−q)n−1q,就有计算式:
E(xk)=(1−q)mqmn1=1∑∞n2=1∑∞⋯nm=1∑∞(i=1∑mni)kj=1∏m(1−q)nj
根据 ik=k![xk]eix,答案就可以写为
E(xk)=(1−q)mqm[k!xk]n1=1∑∞en1x(1−q)n1n2=1∑∞en2x(1−q)n2⋯nm=1∑∞enmx(1−q)nm
注意到这样各个和式之间就不相关了,可以直接写为各和式的乘积:
E(xk)=(1−q)mqm[k!xk](1−(1−q)ex1−1)m
设 r=1−q,那么现在的问题就变为提取 qmemx(1−rex)−m
的 xk 系数,使用 FFT 就可以做到 Θ(klogk) 的时间复杂度,但这显然是不够的。
根据 EI 总结的一套方法,设 F(x)=(x+1)m(1−r(x+1))−m,所求即 qm[xk]F(ex−1)。
由于 ex−1 没有常数项,所以次数高于 xk 的项对于答案没有贡献,我们只需知道 F(x)=F(x)modxk+1,然后求 [xk]F(ex−1) 即可。
直接这样算并没有优化复杂度,但 F(x) 的系数是可整式递推的,设 G(x)=F(x−1),则 G(x) 也是可整式递推的,其前 k 项系数可以 Θ(k) 计算,再配合线性筛就可以计算出 [xk]G(ex)。
具体来讲,求导一下可以得到 F(x) 的 ODE:
(1+x)(q−rx)F′(x)−m(r+q)F(x)=0
提取 xn−1 系数:
nqFn+(q−r)(n−1)Fn−1−r(n−2)Fn−2−m(r+q)Fn−1=0
设 fn=[xn]F(x),u=−(k+1)qFk+1,v=−rkFk,就有
nqfn+(q−r)(n−1)fn−1−r(n−2)fn−2−m(r+q)fn−1=[n=k+1]u+[n=k+2]v
写做 ODE 就是
(1+x)(q−rx)F′(x)−m(r+q)F(x)=uxk+vxk+1
做代换 x=t−1,得到 G(t) 的 ODE:
t(q−r(t−1))G′(t)−m(r+q)G(t)=u(t−1)k+v(t−1)k+1
直接提取系数就能得到递推式,这里就不赘述了。
总时间复杂度 Θ(k)。