问题描述
给你一个长度为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(贡献)=∏ai−K!∏(ai−bi)nk E ( 贡 献 ) = ∏ a i − K ! ∏ ( a i − b i ) n k 。
其中b[i]要枚举所有情况。K!表示,当b[]确定时,每次操作的x的顺序有K!。
那么问题变成了怎么把所有b[]的情况的贡献计算出来。
生成函数
一般生成函数
记 A(x)=∑n≥0aixi A ( x ) = ∑ n ≥ 0 a i x i 为原序列a[]的一个生成函数,由于一般使用生成函数,我们是用来化简一些转移的,所以并不关心x的具体值是什么,我们只关注系数。
就比如背包问题,把记录当前做到的每种体积的方案的数组f[]变成生成函数,我们和一个物品的生成函数相乘,即可得到转移过后的f[]的生成函数。
上面这种转移我们从多项式的角度理解,即卷积,写过FFT的人应该都能理解。
生成函数的笛卡尔积就是两个生成函数A和B的卷积。
生成函数的优美在于,可以把一些特殊的形式幂级数化为一个低次的式子.
比如 A(x)=1+x+x2+...x+∞=11−x A ( x ) = 1 + x + x 2 + . . . x + ∞ = 1 1 − x ,这是等比数列求和,由于正无穷的项的系数我们不会用到,所以忽略了。
这样,几个多项式相乘的形式就可能很简单,也是我们做题的关键,即把答案的生成函数做出来,然后就可以展开得出系数,这道题就是一个应用。
几个重要的式子
OGF的:
11−x