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

该博客探讨了一种数组操作的期望贡献值问题,其中每次操作在数组中等概率选择一个元素并减少其值。通过分析和转换,问题转化为计算所有可能删除次数的贡献并求期望。博主介绍了生成函数的概念,特别是它们在简化数学表达式中的作用,并提供了几个重要的生成函数式子。通过构造生成函数,博主给出了解决此类问题的方法,并展示了如何将生成函数应用于这个问题的解决方案。
摘要由CSDN通过智能技术生成

问题描述

给你一个长度为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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值