题意

现在给你一有n个整数的序列a[],有一个初始为0的值res,重复下面的过程k次:
“随机选择一个[1,n]之间的下标x,res加上所有满足i≠x的a[i]的乘积,然后将a[x]减去1”
问最后res的期望值,对10^9+7取模
n<=5000
k<=10^9

分析

我们把对a[x]的一次操作的贡献看成是

∏a[i]−∏a′[i]∏a[i]−∏a′[i]

\prod a[i]-\prod a'[i]
其中 a′[i]a′[i]a'[i]表示将 a[x]a[x]a[x]减去1后的数组。
不难发现通过连续的操作后,剩下的项就只剩下

∏a[i]−∏(a[i]−b[i])∏a[i]−∏(a[i]−b[i])

\prod a[i]-\prod (a[i]-b[i])
其中 b[i]b[i]b[i]表示 a[i]a[i]a[i]被操作的次数。那么我们要求的就是上述式子的期望。
左边的式子显然是常数,那么只考虑右边的式子。
对于b是数组的每一种取值,对答案的贡献显然是

k!∏(a[i]−b[i])nk∏(b[i])!k!∏(a[i]−b[i])nk∏(b[i])!

\frac{k!\prod(a[i]-b[i])}{n^k\prod (b[i])!}
设生成函数 fi(x)fi(x)f_i(x)表示 b[i]b[i]b[i]取每一种值时对答案的贡献,显然有

fi(x)=∑j>=0(a[i]−j)xjj!fi(x)=∑j>=0(a[i]−j)xjj!

f_i(x)=\sum_{j>=0}\frac{(a[i]-j)x^j}{j!}
化简后得

fi(x)=(a[i]−x)exfi(x)=(a[i]−x)ex

f_i(x)=(a[i]-x)e^x
那么我们要求的答案就是多项式 enx∏(a[i]−x)enx∏(a[i]−x)e^{nx}\prod(a[i]-x)的第k项系数。
右边可以暴力卷积,显然次数为n,左边展开后可以得到

enx=∑i>=0(nx)ii!enx=∑i>=0(nx)ii!

e^{nx}=\sum_{i>=0}\frac{(nx)^i}{i!}
然后继续暴力卷积即可。
时间复杂度 O(n2)O(n2)O(n^2)

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;typedef long long LL;const int N=5005;
const int MOD=1000000007;int n,f[N],k;int ksm(int x,int y)
{int ans=1;while (y){if (y&1) ans=(LL)ans*x%MOD;x=(LL)x*x%MOD;y>>=1;}return ans;
}int dwm(int x,int y)
{int ans=1;while (y--){ans=(LL)ans*x%MOD;x--;}return ans;
}int main()
{scanf("%d%d",&n,&k);f[0]=1;int s=1;for (int i=1;i<=n;i++){int a;scanf("%d",&a);s=(LL)s*a%MOD;for (int j=i;j>=1;j--) f[j]=((LL)f[j]*a%MOD+MOD-f[j-1])%MOD;f[0]=(LL)f[0]*a%MOD;}int ans=0;for (int i=0;i<=min(n,k);i++) (ans+=(LL)ksm(n,k-i)*dwm(k,i)%MOD*f[i]%MOD)%=MOD;ans=(LL)ans*ksm(n,(LL)k*(MOD-2)%(MOD-1))%MOD;ans=(s+MOD-ans)%MOD;printf("%d",ans);return 0;
}

Codeforces 891E Lust 生成函数相关推荐

  1. Codeforces 891E. Lust 生成函数

    Solution 每次得到的值可以看做操作后整个序列的乘积减去操作前整个序列的乘积,这样就把问题转化为求最后数列的乘积减去开始数列的乘积. 把式子列出来,设bib_ibi​为aia_iai​被减去的值 ...

  2. CodeForces 891E Lust(生成函数)

    大致题意:给出一个数列{an},每次随机的选择一个数字ai,产生出了ai之外其余所有数字之积的贡献,然后ai减一.现在进行k次这样的操作,问最后者k次操作产生的贡献之和是多少. 这个贡献看起来很复杂, ...

  3. Codeforces 891E Lust

    Description 给出一个长度为nn的数组aa,有一个计数器resres,接下来进行kk次操作,每次操作等概率的选择[1,n][1,n]中的某个数ii,然后resres加上∑j≠iaj\sum_ ...

  4. codeforces 891E Lust 题解

    题目传送门 题目大意: 给出一个长度为 nnn 的序列,进行 kkk 次操作,每次随机选取一个 aia_iai​,让答案加上 aaa 序列中的其他数的乘积,然后让 ai−1a_i-1ai​−1,问最后 ...

  5. 【CF891E】Lust 生成函数

    [CF891E]Lust 题意:给你一个长度为n的序列$a_i$,对这个序列进行k次操作,每次随机选择一个1到n的数x,令$res+=\prod\limits_{i!=x}a_i$(一开始res=0) ...

  6. [生成函数][DP] Codeforces 891 E. Lust

    SolutionSolutionSolution 设最后是这个样子 a=(ai−bi)a=(ai−bi)\textbf{a}=(a_i-b_i) ,可以通过数学归纳得到 res=∏iai−∏i(ai− ...

  7. 【Codeforces 891 E】 Lust(生成函数)

    传送门 考虑每次贡献可以差分成aj∏i≠jai−(aj−1)∏i≠jaia_j\prod_{i\not=j}a_i-(a_j-1)\prod_{i\not=j}a_iaj​∏i​=j​ai​−( ...

  8. CodeForces 891 E.Lust(生成函数)

    Description 给出一长度为nnn的序列a1,...,an" role="presentation" style="position: relative ...

  9. Lust(Codeforces Round #446 Div.1-891E)(母函数\生成函数)

    文章目录 题目 思路 代码 题目 你有n个数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ ,要进行 kkk 次操作,每次在 111 ~ nnn 中随机选择一个 ...

最新文章

  1. html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例
  2. IIS支持http协议的:put、delete等方法
  3. 网络营销——专业的站内、站外优化还是得靠专业网络营销公司
  4. 快速获取Android应用包名和Activity名
  5. 3、常用数据库访问接口简介
  6. 设备服务器停止运行吗,服务器已停止响应是怎么回事
  7. topcoder srm 380 div1
  8. python面向对象编程之实例属性和类属性
  9. matlab 功率谱密度 汉宁窗_[振动与测试 2] 什么是PSD(功率谱密度)
  10. WinCE5.0下直接写屏操作与函数 CreateDIBSection() 的使用(转)
  11. [转载] python3 格式化字符串 f-string 介绍
  12. React Native 圆形进度条组件
  13. centos7.x/RedHat7.x重命名网卡名称
  14. 反射方法返回值是数组时取其中元素的办法
  15. OCR身份证信息批量识别导出excel
  16. Unity3D发布错误:could not allocate memery:system out of memery!
  17. pytorch torch.nn到底是什么?
  18. php实现钟表,用html5实现一个简单的钟表外观
  19. python 有趣包_一些有趣且鲜为人知的 Python 特性
  20. Java继承思想(理解+代码)

热门文章

  1. wait释放锁的说明
  2. 计算机专业报考小学教师资格证的什么科目,教师资格证小学可以报考哪些科目?...
  3. 三菱电梯服务器维修,三菱电梯通讯故障维修分析总结
  4. C#调用映美云打印机CFP535
  5. python中多分支结构可以不用else吗_Python3基础 多分支结构 if-elif-else
  6. lisp 画一个矩形
  7. android 应用学习
  8. 使用js模拟点击a链接 无效的解决方案
  9. 吉林大学人工智能学院计算机,吉林大学成立人工智能学院
  10. 跟益达学Solr5之使用Jetty部署Solr