题目传送门

题目大意: 给出一个长度为 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. shell字符串截取方法
  2. Scrapy002-框架安装
  3. ubuntu获取root权限_群辉 SSH 获取 root 权限
  4. 从入门到进阶|如何基于WebRTC搭建一个视频会议
  5. 78. Subsets 子集
  6. 设计模式--享元模式实现C++
  7. 我心中的ASP.NET Core 新核心对象WebHost(一)
  8. MySQL week()函数
  9. java哪个城市的需求量大_4大互联网热门城市Java薪资情况,看完你想去哪个城市发展呢?...
  10. 分享WordPress博客搜索引擎优化的六点经验
  11. FluentNhibernate 组件component及应用
  12. java七大设计原则,23种设计模式
  13. java语言在线编译器的设计与实现,已获万赞
  14. 语音识别芯片原理是什么 语音识别芯片有哪些【详解】
  15. 【语音识别】基于matlab功率谱和倍频法男女生识别【含Matlab源码 705期】
  16. 数据库索引选择的探索(二)之直方图
  17. 最新Django经典面试问题与答案汇总
  18. macOS在使用音视频通话时会降低其他音频声音的解决方法
  19. C#隐藏tabcontrol
  20. (亲测可用)如何在Win10家庭版中找回组策略编辑器

热门文章

  1. 2021年10月8日模拟赛(保龄奇遇记)
  2. vue中mint-ui使用详解
  3. 论文阅读Super Edge 4-Points Congruent Sets-Based Point Cloud Global Registration
  4. 基于Pycharm的Django学习 —— 项目实战(Form和ModelForm)
  5. 第一章 信息源泉——推介资料出处
  6. 终于有了任何程序员都能快速编写文档的工具!
  7. Q群监控进退群发邮件 引流思路详解
  8. 把荷花照片调成古典工笔画的PS方法
  9. 2019年帮解BUG,做设计,Android,WEB
  10. php 强制返回,给PHP增加函数强制类型返回