[生成函数阶段性小结][CF891E]Lust

问题描述

给你一个长度为n的数组a[],还有操作数K,每次操作你在下标[1..n]中等概率选择一个下标x,贡献+= i!=xa[i] ∏ i ! = x a [ i ] ,然后a[x]-=1。求K次操作后贡献期望值,对1e9+7取模。
n<=5000,K<=1e9

问题分析

首先期望可以看作是所有方案的贡献除以方案数。
我们看到那个 不能算x,这不利于我们化式子,直接这样根本没有思路。
我们稍微化一化: ia[i]ia[i] ∏ i a [ i ] − ∏ i a ′ [ i ] ,其中a’为a[x]-=1后的序列。
我们观察连续几次相减,发现中间的项全部被消掉了。
那么设b[i]表示i这个位置被删了b[i]次。那么一种方案的贡献就是 a[i](a[i]b[i]) ∏ a [ i ] − ∏ ( a [ i ] − b [ i ] )
那么 E()=aiK!(aibi)nk E ( 贡 献 ) = ∏ a i − K ! ∏ ( a i − b i ) n k
其中b[i]要枚举所有情况。K!表示,当b[]确定时,每次操作的x的顺序有K!。
那么问题变成了怎么把所有b[]的情况的贡献计算出来。

生成函数

一般生成函数

A(x)=n0aixi A ( x ) = ∑ n ≥ 0 a i x i 为原序列a[]的一个生成函数,由于一般使用生成函数,我们是用来化简一些转移的,所以并不关心x的具体值是什么,我们只关注系数。
就比如背包问题,把记录当前做到的每种体积的方案的数组f[]变成生成函数,我们和一个物品的生成函数相乘,即可得到转移过后的f[]的生成函数。
上面这种转移我们从多项式的角度理解,即卷积,写过FFT的人应该都能理解。
生成函数的笛卡尔积就是两个生成函数A和B的卷积。
生成函数的优美在于,可以把一些特殊的形式幂级数化为一个低次的式子.
比如 A(x)=1+x+x2+...x+=11x A ( x ) = 1 + x + x 2 + . . . x + ∞ = 1 1 − x ,这是等比数列求和,由于正无穷的项的系数我们不会用到,所以忽略了。
这样,几个多项式相乘的形式就可能很简单,也是我们做题的关键,即把答案的生成函数做出来,然后就可以展开得出系数,这道题就是一个应用。

几个重要的式子

OGF的:
11x

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值