题目传送门

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

题解

膜拜往日的神仙 OZY。

与样例快乐van耍之后,发现答案与操作顺序无关,只与每个位置被操作的次数有关。

那么不妨认为每个数都是被连续操作的,那么我们可以把一次操作的贡献看成 (ax∏i≠xai)−((ax−1)∏i≠xai)(a_x\prod\limits_{i\ne x}a_i)-((a_x-1)\prod\limits_{i\ne x}a_i)(ax​i​=x∏​ai​)−((ax​−1)i​=x∏​ai​),那么把 sss 次对 xxx 的连续操作加起来,就得到了 (ax∏i≠xai)−((ax−s)∏i≠xai)(a_x\prod\limits_{i\ne x}a_i)-((a_x-s)\prod\limits_{i\ne x}a_i)(ax​i​=x∏​ai​)−((ax​−s)i​=x∏​ai​)。

同样的,把 kkk 次操作后的贡献加起来,就能得到 ∏ai−∏(ai−bi)\prod a_i-\prod (a_i-b_i)∏ai​−∏(ai​−bi​),其中 bib_ibi​ 是第 iii 个数被操作的次数。

前面一项是固定的,只需要求后面一项的期望即可。

对每一个数 aja_jaj​ 造一个生成函数,xix^ixi 项表示这个数被操作 iii 次,系数就是被操作 iii 次的贡献,即 (aj−i)(a_j-i)(aj​−i)。

考虑到所有操作形成一个排列,一个 bbb 序列可能对应多种操作方式,所以用 EGFEGFEGF,有 fj=∑i=0(aj−i)xii!f_j=\sum\limits_{i=0}(a_j-i)\dfrac {x^i} {i!}fj​=i=0∑​(aj​−i)i!xi​。

那么将所有 fjf_jfj​ 乘起来,xkx^kxk 那一项的系数就是答案。但是 xkx^kxk 下面有个 k!k!k!,系数乘过来的时候得到的是 xkx^kxk 的系数,而不是 xkk!\dfrac {x^k} {k!}k!xk​ 的系数,所以这一项的系数还要乘以 k!k!k!,才是我们想要的 xkk!\dfrac {x^k} {k!}k!xk​ 的系数。

并且,由于需要求的是期望,而这一项的系数是所有方案的和,所以还要除以总方案数 nkn^knk。

所以,最终的柿子为:
k!nk∏j=1n(∑i=0(aj−i)xii!)=k!nk∏j=1n(∑i=0ajxii!−∑i=0ixii!)=k!nk∏j=1n(ajex−∑i=0xi(i−1)!)=k!nk∏j=1n(ajex−∑i=0xxii!)=k!nk∏j=1n(aj−x)ex=k!nkenx∏j=1n(aj−x)\begin{aligned} &~~~~~\frac {k!} {n^k}\prod_{j=1}^n(\sum_{i=0}(a_j-i)\frac {x^i} {i!})\\ &=\frac {k!} {n^k}\prod_{j=1}^n(\sum_{i=0}a_j\frac {x^i} {i!}-\sum_{i=0}i\frac {x^i} {i!})\\ &=\frac {k!} {n^k}\prod_{j=1}^n(a_je^{x}-\sum_{i=0}\frac {x^i} {(i-1)!})\\ &=\frac {k!} {n^k}\prod_{j=1}^n(a_je^{x}-\sum_{i=0} x \frac {x^i} {i!})\\ &=\frac {k!} {n^k}\prod_{j=1}^n(a_j-x)e^{x}\\ &=\frac {k!} {n^k} e^{nx} \prod_{j=1}^n(a_j-x)\\ \end{aligned} ​     nkk!​j=1∏n​(i=0∑​(aj​−i)i!xi​)=nkk!​j=1∏n​(i=0∑​aj​i!xi​−i=0∑​ii!xi​)=nkk!​j=1∏n​(aj​ex−i=0∑​(i−1)!xi​)=nkk!​j=1∏n​(aj​ex−i=0∑​xi!xi​)=nkk!​j=1∏n​(aj​−x)ex=nkk!​enxj=1∏n​(aj​−x)​

后面的 ∏\prod∏ 可以 n2n^2n2 暴力求,设 f[i]f[i]f[i] 表示求完之后的多项式的 xix^ixi 项的系数。

由于需要求第 kkk 项的系数,而后面的 ∏\prod∏ 得到的是个 nnn 次的多项式,所以只需要 enxe^{nx}enx 后 nnn 项的系数。

最后的答案就是:
ans=k!nk∑i=0min⁡(n,k)f[i]×nk−i(k−i)!=∑i=0min⁡(n,k)f[i]×(k−i+1)(k−i+2)...kni\begin{aligned} ans&=\frac {k!} {n^k} \sum_{i=0}^{\min(n,k)} f[i]\times \frac {n^{k-i}} {(k-i)!}\\ &=\sum_{i=0}^{\min(n,k)} f[i]\times \frac {(k-i+1)(k-i+2)...k} {n^i} \end{aligned} ans​=nkk!​i=0∑min(n,k)​f[i]×(k−i)!nk−i​=i=0∑min(n,k)​f[i]×ni(k−i+1)(k−i+2)...k​​

代码如下:

#include <cstdio>
#define mod 1000000007int n,k,f[5010],ans=0;
int ksm(int x,int y){int re=1;for(;(y&1?re=1ll*re*x%mod:0),y;y>>=1,x=1ll*x*x%mod);return re;}
inline int min(int x,int y){return x<y?x:y;}
#define inv(x) ksm(x,mod-2)int main()
{scanf("%d %d",&n,&k);f[0]=1;for(int i=1,x;i<=n;i++){scanf("%d",&x);for(int j=i;j>0;j--)f[j]=(1ll*f[j]*x%mod-f[j-1]+mod)%mod;f[0]=1ll*f[0]*x%mod;}for(int i=0,fac=1,n_=1;i<=min(n,k);i++){ans=(ans+1ll*f[i]*fac%mod*inv(n_)%mod)%mod;fac=1ll*fac*(k-i)%mod;n_=1ll*n_*n%mod;}printf("%d",(f[0]-ans+mod)%mod);
}

codeforces 891E Lust 题解相关推荐

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

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

  2. Codeforces 891E. Lust 生成函数

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

  3. Codeforces 891E Lust 生成函数

    题意 现在给你一有n个整数的序列a[],有一个初始为0的值res,重复下面的过程k次: "随机选择一个[1,n]之间的下标x,res加上所有满足i≠x的a[i]的乘积,然后将a[x]减去1& ...

  4. Codeforces 891E Lust

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

  5. c语言1106回文数,Codeforces 1106 简要题解

    A题 传送门 读错题还能过样例我给自己点个赞. 题意简述:给一个010101网格SSS,问满足Si,j=Si+1,j+1=Si+1,j−1=Si−1,j−1=Si−1,j+1S_{i,j}=S_{i+ ...

  6. Educational Codeforces Round 95题解

    Educational Codeforces Round 95题解 题目链接 代码链接 A. Buying Torches 题目大意: 你手上现在有一个木棍.有以下两种交换方式: 1.用一个木棍交换x ...

  7. 【Codeforces div3-498】题解

    Codeforces div3-498题解 A. Adjacent Replacements 对于这道题目就比较简单了,如果该数N为奇数,那么经过变换之后不变,如果该数为偶数则变为N - 1 #inc ...

  8. Codeforces 1110 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...

  9. codeforces round #827题解(完整)

    Problem - A - Codeforces 大致意思就是说给定三个数,判断是否存在一个数是另外两个数之和. #include<bits/stdc++.h> using namespa ...

最新文章

  1. 和rgb画面质量谁好_双11内存RGB灯条如何选?低于400元,只聊酷兽和阿斯加特
  2. 大众点评app 数据解密和反序列化
  3. java okhttp包的类特点
  4. 再见 Docker !5分钟转型 containerd !
  5. 【报告分享】数据资产化之路----数据资产的估值与行业实践.pdf
  6. 在国外当程序员有多爽
  7. mybatis存在就不插入_mybatis只能进行查找,不能进行删除,插入,更新解决方案...
  8. 2021-03-16 转自知乎专栏 https://zhuanlan.zhihu.com/p/24482664
  9. 递归法:计算m个A,n个B可以组合成多少种排列问题?
  10. 梳子刻字刻什么好_石阶上被刻了1700多个汉字,网友狂赞!
  11. Linux上层应用--Shell scripts基础规范
  12. iOS应用审核的通关秘籍
  13. 动易CMS - 模板的一些常用标签
  14. Qt Model/View 学习(6) - Delegate教程之——渲染
  15. 【WLM200Think无线鼠标拆解】鼠标中键有什么用?如何用鼠标中键提高效率? 鼠标中键不灵敏如何修理?
  16. 计算机运行内存和显卡内存不足,系统提示显卡内存不足怎么办?-解决系统提示显卡内存不足的方法 - 河东软件园...
  17. 刘新华老师-沪师经纪
  18. 【数据库系统】第一部分 数据库基础(4) 数据库安全性
  19. docker部署微服务项目
  20. 功利性读书,提升认知效率

热门文章

  1. java处理word插入数据转PDF及下载PDF
  2. Prometheus 实战于源码分析之discovery
  3. 我也不知道说什么....
  4. 最强Java修仙之路【附赠BAT修炼资源】,这些核心技能是你必须要掌握的!!
  5. 本科毕业论文研究结果与预期不符怎么办?
  6. 贵金属白银实时走势图——解读要领
  7. 卡巴斯基官方论坛送一年免费升级
  8. 计算机小游戏有哪些,4399电脑小游戏中有一个和lol类似的游戏叫什么
  9. 金融行业管理解决方案
  10. 分析Java未来几年的发展前景