Codeforces 1477F. Nezzar and Chocolate Bars

好题! (opens new window)

题意:你有一条长为L的线段,初始时线段上已经有n1个分割点将其划分为n段,其中第i段长为li。每次在[0,L]中随机一个实数r,在线段上加入坐标为r的分割点,直到所有分割点将线段分割为每段长度不超过K的若干段。求新加入的分割点个数的期望。模998244353

n50,L,K2000

题解:

令生成函数f对应的指数生成函数为f~

首先考虑n=1的情况。假设第i步及以内能够结束的概率为pi,那么答案为i0(1pi)。考虑如何计算pi

显然,第n步及以内可以结束等价于无论是否达到要求强行做到第n步,此时符合要求。考虑每一步的随机都是独立的,那么随机生成的坐标点列(z1,z2,,zn)是均匀分布在ΩL={(z1,z2,,zn)|0ziL,i=1,2,,n}中的,每一个特定的坐标点列(z1,z2,,zn)被生成的概率元为:

dzΩLdz=dzLn

但从(z1,z2,,zn)中无法很好地分析是否满足K的要求,考虑对该空间进行转化。在ΩL中的点坐标几乎都是两两不同的,将其排序,转化为(z^1,z^2,,z^n),其中0z^1z^2z^nL,令Ω^L={(z^1,z^2,,z^n)|0z^1z^2z^nL},则Ω^L中的每个点几乎都对应n!ΩL中的点,于是每个Ω^L中的点的概率元为n!dzLn

为了判断是否满足要求,进一步将(z^1,z^2,,z^n)唯一对应到其差分数组(z^1,z^2z^1,,z^nz^n1),均匀分布在空间Ω~L={(z~1,z~2,,z~n)|z~i0,i=1nz~iL}中,每个点的概率元仍然为n!dzLn。顺便说明,这证明了Ω~Ldz=Lnn!

于是在Ω~L中,(z~1,z~2,,z~n)符合要求等价于0z~iK,i=1,2,,n0Li=1nziK,于是我们有符合要求的概率等于ΩK(Ω~LΩ~LK)中的点的概率元的和,即:

pn=ΩK(Ω~LΩ~LK)n!dzLn=n!Ln(ΩKΩ~LdzΩKΩ~LKdz)

现在关注如何求出ΩAΩ~Bdz,定义可重集ΦA,S={(z1,z2,,zn)|ziA,iS,zi0,iS}

容斥ΩAztA的限制,就可以将ΩA几乎完全地用若干个ΦA,S表示出来(除若干边界上的点以外):

ΩA=S{1,2,,n}(1)|S|ΦA,S

于是:

ΩAΩ~Bdz=S{1,2,,n}(1)|S|ΦA,SΩ~Bdz

而对于ΦA,SΩ~B中的点(z1,z2,,zn),可以将满足iSzi减去A,从而与Ω~B|S|A中的点一一对应,于是ΦA,SΩ~BΩ~B|S|A的积分相等,由前文证明的结论可以得到:

ΩAΩ~Bdz=S{1,2,,n}(1)|S|Ω~B|S|Adz=i=0n(1)i(ni)Ω~BiAdz=i=0BA(1)i(ni)(BiA)nn!

回代到pn的表达式中,可以得到:

pn=n!Ln(i=0LK(1)i(ni)(LiK)nn!i=0LK1(1)i(ni)(L(i+1)K)nn!)=i=0LK(1)i(ni)(1iKL)n+i=1LK(1)i(ni1)(1iKL)n=1+i=1LK(1)i(n+1i)(1iKL)n

于是没有初始分割点的答案就为i0j=1LK(1)j+1(i+1j)(1jKL)i,下面考虑存在初始分割点的情况。

定义qi,j=1+k=1liK(1)k(j+1k)(1kKli)jQi=k0qi,k(liL)kxkpi仍然如上定义,P=k0pkxk,则此时pi的值为:

pi=k1+k2++kn=i(ik1,k2,,kn)j=1n(ljL)kjqj,kjpii!=k1+k2++kn=ij=1n(ljL)kjqj,kjkj!

即:

P~=i=1nQ~i

我们要求的答案是k0(1k![xk]P~)=k0k![xk](exP~),那么首先考虑Q~i的表达式:

Q~i=j01j!(1+k=1liK(1)k(j+1k)(1kKli)j)(liL)jxj=j01j!(liL)jxj+j01j!k=1liK(1)k(j+1k)(likKL)jxj=eliLx+j0k=1min{j+1,liK}(1)kj+1k!(j+1k)!(likKL)jxj=eliLx+j0k=1min{j+1,liK}(1)kj+1k+kk!(j+1k)!(likKL)jxj=eliLx+j0k=1min{j,liK}(1)k1k!(jk)!(likKL)jxj+j0k=1min{j+1,liK}(1)k1(k1)!(j+1k)!(likKL)jxj=eliLx+k=1liK(1)kk!jk(likKL)j(jk)!xj+k=1liK(1)k(k1)!jk1(likKL)j(j(k1))!xj=eliLx+k=1liK(1)k(likKL)kxkk!j0(likKL)jj!xj+k=1liK(1)k(likKL)k1xk1(k1)!j0(likKL)jj!xj=eliLx+k=1liK(1)k(likKL)kxkk!e(likKL)x+k=1liK(1)k(likKL)k1xk1(k1)!e(likKL)x=eliLx(1+k=1liK(1)k(likKL)kk!xkekKLx+k=1liK(1)k(likKL)k1(k1)!xk1ekKLx)

括号外的部分全部相乘,即为ex,考虑括号内的部分,可以发现相乘之后可以表示为若干项xkjekKLx的线性组合,于是可以利用以j,k为下标的二维卷积计算每一项的系数,就得到了exP~的一个以若干项xkeCx的线性组合表示的表达式。

最后,只需要考虑如何计算i0i![xi](xkeCx)即可。考虑:

i0i![xi](xkeCx)=i0(i+k)!Cii!=k!i0(i+ki)Ci

Fk=i0(i+ki)Ci,于是:

Fk=i0(i+ki)Ci=i0((i+k1i1)+(i+k1i))Ci=i1(i1+ki1)Ci+i0(i+k1i)Ci=CFk+Fk1

F0=11C,于是Fk=1(1C)k+1,有i0i![xi](xkeCx)=k!(1C)k+1

利用前文的分析,用分治FFT计算二维卷积,可以在O(nLlognL)的时间内解决问题。最后记得处理边界条件,如K=li的情况可能要令00=0