【CFgym102482D】Gem Island(生成函数)

题意:

有一个序列 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an,初始时它们全为 1 1 1。进行 d d d 轮操作:每轮操作以正比于 a a a 的概率选择一个 a i a_i ai 1 1 1。求最后 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an 中前 r r r 大的和的期望,精度要求 1 0 − 6 10^{-6} 106

n , d , r ≤ 500 n,d,r\leq 500 n,d,r500

题解:

即为求:
1 n ( n + 1 ) ⋯ ( n + d − 1 ) ∑ a 1 + ⋯ + a n = d ( d a 1 , ⋯   , a n ) ∏ i = 1 n ( a i ! ) ∑ k = 1 r k t h m a x i = 1 n ( a i ) = d ! n ( n + 1 ) ⋯ ( n + d − 1 ) ∑ a 1 + ⋯ + a n = d ∑ k = 1 r k t h m a x i = 1 n ( a i ) = 1 ( n + d − 1 d ) ∑ a 1 + ⋯ + a n = d ∑ k = 1 r k t h m a x i = 1 n ( a i ) \begin{aligned} &\frac{1}{n(n+1)\cdots(n+d-1)}\sum_{a_1+\cdots+a_n=d}\binom{d}{a_1,\cdots,a_n}\prod_{i=1}^n (a_i!)\sum_{k=1}^{r} kthmax_{i=1}^{n}(a_i)\\ =&\frac{d!}{n(n+1)\cdots(n+d-1)}\sum_{a_1+\cdots+a_n=d}\sum_{k=1}^{r} kthmax_{i=1}^{n}(a_i)\\ =&\frac{1}{\binom{n+d-1}{d}}\sum_{a_1+\cdots+a_n=d}\sum_{k=1}^{r} kthmax_{i=1}^{n}(a_i)\\ \end{aligned} ==n(n+1)(n+d1)1a1++an=d(a1,,and)i=1n(ai!)k=1rkthmaxi=1n(ai)n(n+1)(n+d1)d!a1++an=dk=1rkthmaxi=1n(ai)(dn+d1)1a1++an=dk=1rkthmaxi=1n(ai)
h n , d h_{n,d} hn,d 表示所有 a 1 + ⋯ + a n = d a_1+\cdots+a_n=d a1++an=d 的方案中前 r r r 大的 a i a_i ai 的和的和。那么:
h n , d = ∑ i = 1 n ( n i ) ( min ⁡ ( r , i ) ( ( d − i ) + i − 1 i − 1 ) + h i , d − i ) h_{n,d}=\sum_{i=1}^{n}\binom{n}{i}\left(\min(r,i)\binom{(d-i)+i-1}{i-1}+h_{i,d-i}\right) hn,d=i=1n(in)(min(r,i)(i1(di)+i1)+hi,di)
其中 i i i 枚举的是有多少 a j a_j aj 至少为 1 1 1。DP 的过程可以理解为从最底层开始一层一层地在上一层的基础上往上填。

对于取模而不必考虑精度的情况,可以做到更快。

对于 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an 中前 r r r 大的和,可以转为 ∑ i ≥ 1 min ⁡ ( r , ( a 1 , ⋯   , a n 中 ≥ i 的数的个数 ) ) \sum_{i\geq 1}\min(r,(a_1,\cdots,a_n中\geq i的数的个数)) i1min(r,(a1,,ani的数的个数))

f i , k f_{i,k} fi,k 表示 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an 中恰好有 k k k 个数 ≥ i \geq i i 的方案数,那么:
f i , k = ( n k ) [ x d ] ( x i 1 − x ) k ( 1 − x i 1 − x ) n − k \begin{aligned} f_{i,k}&=\binom{n}{k}[x^d]\left(\frac{x^i}{1-x}\right)^k\left(\frac{1-x^i}{1-x}\right)^{n-k}\\ \end{aligned} fi,k=(kn)[xd](1xxi)k(1x1xi)nk
我们要求的是:
∑ i ≥ 1 ∑ k min ⁡ ( r , k ) f i , k = ∑ i ≥ 1 ∑ k min ⁡ ( r , k ) ( n k ) [ x d ] x i k ( 1 − x i ) n − k ( 1 − x ) n = ∑ i ≥ 1 ∑ k min ⁡ ( r , k ) ( n k ) ∑ j ≥ 0 [ x j ] ( x k ( 1 − x ) n − k ) [ x d − i j ] 1 ( 1 − x ) n = ∑ j ≥ 0 ( ∑ k min ⁡ ( r , k ) ( n k ) [ x j ] x k ( 1 − x ) n − k ) ( ∑ i ≥ 1 [ x d − i j ] 1 ( 1 − x ) n ) = ∑ j ≥ 0 A j B j \begin{aligned} &\sum_{i\geq 1}\sum_{k}\min(r,k)f_{i,k}\\ =&\sum_{i\geq 1}\sum_{k}\min(r,k)\binom{n}{k}[x^{d}]\frac{x^{ik}(1-x^i)^{n-k}}{(1-x)^n}\\ =&\sum_{i\geq 1}\sum_{k}\min(r,k)\binom{n}{k}\sum_{j\geq 0}[x^j]\bigg(x^k(1-x)^{n-k}\bigg)[x^{d-ij}]\frac{1}{(1-x)^n}\\ =&\sum_{j\geq 0}\left(\sum_{k}\min(r,k)\binom{n}{k}[x^j]x^k(1-x)^{n-k}\right)\left(\sum_{i\geq 1}[x^{d-ij}]\frac{1}{(1-x)^n}\right)\\ =&\sum_{j\geq 0}A_jB_j\\ \end{aligned} ====i1kmin(r,k)fi,ki1kmin(r,k)(kn)[xd](1x)nxik(1xi)nki1kmin(r,k)(kn)j0[xj](xk(1x)nk)[xdij](1x)n1j0(kmin(r,k)(kn)[xj]xk(1x)nk)(i1[xdij](1x)n1)j0AjBj
第二步很有技巧性,实现了 i , k i,k i,k 的分离。

对于 A j A_j Aj
A j = ∑ k min ⁡ ( r , k ) ( n k ) [ x j ] x k ( 1 − x ) n − k = ∑ k min ⁡ ( r , k ) ( n k ) ( − 1 ) j − k ( n − k j − k ) \begin{aligned} A_j=&\sum_{k}\min(r,k)\binom nk[x^j]x^k(1-x)^{n-k}\\ =&\sum_{k}\min(r,k)\binom nk(-1)^{j-k}\binom{n-k}{j-k}\\ \end{aligned} Aj==kmin(r,k)(kn)[xj]xk(1x)nkkmin(r,k)(kn)(1)jk(jknk)
其实到这里就已经可以直接 O ( n log ⁡ n ) O(n\log n) O(nlogn) 卷了,但事实上:
A j = ∑ k min ⁡ ( r , k ) ( n k ) [ x j ] x k ( 1 − x ) n − k = ∑ k = 0 r k ( n k ) [ x j ] x k ( 1 − x ) n − k + r ∑ k > r ( n k ) [ x j ] x k ( 1 − x ) n − k \begin{aligned} A_j=&\sum_{k}\min(r,k)\binom nk[x^j]x^k(1-x)^{n-k}\\ =&\sum_{k=0}^rk\binom nk[x^j]x^k(1-x)^{n-k}+r\sum_{k>r}\binom{n}{k}[x^j]x^k(1-x)^{n-k}\\ \end{aligned} Aj==kmin(r,k)(kn)[xj]xk(1x)nkk=0rk(kn)[xj]xk(1x)nk+rk>r(kn)[xj]xk(1x)nk
对于后者:
∑ k = 0 r ( n k ) [ x j ] x k ( 1 − x ) n − k = ∑ k = 0 r [ u k x j ] ( n k ) ( u x ) k ( 1 − x ) n − k = ∑ k = 0 r [ u k x j ] ( ( u x ) + ( 1 − x ) ) n = [ u r x j ] ( u x + 1 − x ) n 1 − u = [ u r x j ] ( ( u − 1 ) x + 1 ) n 1 − u = ( n j ) [ u r ] ( u − 1 ) j 1 − u = ( n j ) ( − 1 ) j − r ( j − 1 r ) \begin{aligned} &\sum_{k=0}^r\binom{n}{k}[x^j]x^k(1-x)^{n-k}\\ =&\sum_{k=0}^r[u^kx^j]\binom{n}{k}{(ux)}^k(1-x)^{n-k}\\ =&\sum_{k=0}^r[u^kx^j]((ux)+(1-x))^n\\ =&[u^rx^j]\frac{(ux+1-x)^n}{1-u}\\ =&[u^rx^j]\frac{((u-1)x+1)^n}{1-u}\\ =&\binom{n}{j}[u^r]\frac{(u-1)^j}{1-u}\\ =&\binom{n}{j}(-1)^{j-r}\binom{j-1}{r} \end{aligned} ======k=0r(kn)[xj]xk(1x)nkk=0r[ukxj](kn)(ux)k(1x)nkk=0r[ukxj]((ux)+(1x))n[urxj]1u(ux+1x)n[urxj]1u((u1)x+1)n(jn)[ur]1u(u1)j(jn)(1)jr(rj1)
对于前者也是类似的。

对于 B j = ∑ i j ≤ d c i j B_j=\sum_{ij\leq d}c_{ij} Bj=ijdcij,其中 c p = [ x d − p ] 1 ( 1 − x ) n c_p=[x^{d-p}]\frac{1}{(1-x)^n} cp=[xdp](1x)n1。这相当于一个高维后缀和(一维对应一个质数幂),可以做到 O ( n log ⁡ log ⁡ n ) O(n\log \log n) O(nloglogn)

总时间复杂度 O ( n log ⁡ log ⁡ n ) O(n\log \log n) O(nloglogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值