Description

给出一长度为nnn的序列a1,...,an" role="presentation" style="position: relative;">a1,...,ana1,...,ana_1,...,a_n,每次操作等概率的从111~n" role="presentation" style="position: relative;">nnn中选一个数xxx,把这n" role="presentation" style="position: relative;">nnn个数去掉axaxa_x后的乘积加到答案里,然后把axaxa_x减一,问kkk次操作后答案的期望值

Input

第一行输入两个整数n,k" role="presentation" style="position: relative;">n,kn,kn,k,之后输入nnn个整数ai(1≤n≤5000,1≤k≤109,0≤ai≤109)" role="presentation" style="position: relative;">ai(1≤n≤5000,1≤k≤109,0≤ai≤109)ai(1≤n≤5000,1≤k≤109,0≤ai≤109)a_i(1\le n\le 5000,1\le k\le 10^9,0\le a_i\le 10^9)

Output

保证答案可以写成最简分数形式PQPQ\frac{P}{Q},输出P⋅Q−1 mod109+7P⋅Q−1mod109+7P\cdot Q^{-1}\ mod 10^9+7

Sample Input

2 1
5 5

Sample Output

5

Solution

假设某次操作前这nnn个数字变成ai−bi" role="presentation" style="position: relative;">ai−biai−bia_i-b_i,bibib_i为iii被选中的次数

当前操作选中了x" role="presentation" style="position: relative;">xxx,那么该次操作的贡献为∏i≠x(ai−bi)=∏i=1n(ai−bi)−(ai−(bi+1))∏i≠x(ai−bi)∏i≠x(ai−bi)=∏i=1n(ai−bi)−(ai−(bi+1))∏i≠x(ai−bi)\prod\limits_{i\neq x}(a_i-b_i)=\prod\limits_{i=1}^n(a_i-b_i)-(a_i-(b_i+1))\prod\limits_{i\neq x}(a_i-b_i)

不妨设ci=bi,i≠x,cx=bx+1ci=bi,i≠x,cx=bx+1c_i=b_i,i\neq x,c_x=b_x+1为该次操作结束后iii被选中的次数

那么本次操作的贡献可以写成: ∏i=1n(ai−bi)−∏i=1n(ai−ci)" role="presentation" style="position: relative;">∏i=1n(ai−bi)−∏i=1n(ai−ci)∏i=1n(ai−bi)−∏i=1n(ai−ci)\prod\limits_{i=1}^n(a_i-b_i)-\prod\limits_{i=1}^n(a_i-c_i)

计算该交错和得总贡献为∏i=1nai−∏i=1n(ai−bi)∏i=1nai−∏i=1n(ai−bi)\prod\limits_{i=1}^na_i-\prod\limits_{i=1}^n(a_i-b_i),其中bibib_i为kkk次操作后i" role="presentation" style="position: relative;">iii被选中的次数,∑i=1nbi=k∑i=1nbi=k\sum\limits_{i=1}^nb_i=k

故答案的期望值为1nk∑∑i=1nbi=kk!∏i=1nbi!(∏i=1nai−∏i=1n(ai−bi))=∏i=1nai−k!nk∑∑i=1nbi=k∏i=1nai−bibi!1nk∑∑i=1nbi=kk!∏i=1nbi!(∏i=1nai−∏i=1n(ai−bi))=∏i=1nai−k!nk∑∑i=1nbi=k∏i=1nai−bibi!\frac{1}{n^k}\sum_{\sum\limits_{i=1}^nb_i=k}\frac{k!}{\prod\limits_{i=1}^nb_i!}(\prod\limits_{i=1}^na_i-\prod\limits_{i=1}^n(a_i-b_i))=\prod\limits_{i=1}^na_i-\frac{k!}{n^k}\sum_{\sum\limits_{i=1}^nb_i=k}\prod\limits_{i=1}^n\frac{a_i-b_i}{b_i!}

令Pj(x)Pj(x)P_j(x)为上述求和式中第jjj项对答案的贡献,则有Pj(x)=∑i≥0aj−ii!xi,1≤j≤n" role="presentation" style="position: relative;">Pj(x)=∑i≥0aj−ii!xi,1≤j≤nPj(x)=∑i≥0aj−ii!xi,1≤j≤nP_j(x)=\sum\limits_{i\ge 0}\frac{a_j-i}{i!}x^i,1\le j\le n

化简得Pj(x)=aj∑i≥01i!xi−x∑i≥11(i−1)!xi−1=(aj−x)⋅exPj(x)=aj∑i≥01i!xi−x∑i≥11(i−1)!xi−1=(aj−x)⋅exP_j(x)=a_j\sum\limits_{i\ge 0}\frac{1}{i!}x^i-x\sum\limits_{i\ge 1}\frac{1}{(i-1)!}x^{i-1}=(a_j-x)\cdot e^x

记f(k)=∑∑i=1nbi=k∏i=1nai−bibi!f(k)=∑∑i=1nbi=k∏i=1nai−bibi!f(k)=\sum_{\sum\limits_{i=1}^nb_i=k}\prod\limits_{i=1}^n\frac{a_i-b_i}{b_i!},考虑其生成函数F(x)=∑i≥0f(i)⋅xiF(x)=∑i≥0f(i)⋅xiF(x)=\sum\limits_{i\ge 0}f(i)\cdot x^i

有F(x)=∏j=1nPj(x)=enx⋅∏j=1n(aj−x)=enx⋅G(x)F(x)=∏j=1nPj(x)=enx⋅∏j=1n(aj−x)=enx⋅G(x)F(x)=\prod\limits_{j=1}^nP_j(x)=e^{nx}\cdot \prod\limits_{j=1}^n(a_j-x)=e^{nx}\cdot G(x)

O(n2)O(n2)O(n^2)直接计算得G(x)=∑i=0ngi⋅xiG(x)=∑i=0ngi⋅xiG(x)=\sum\limits_{i=0}^ng_i\cdot x^i,进而有:

f(k)=[xk]F(x)=∑i=0min(n,k)[xi]G(x)⋅[xk−i]enx=∑i=0min(n,k)gi⋅nk−i(k−i)!f(k)=[xk]F(x)=∑i=0min(n,k)[xi]G(x)⋅[xk−i]enx=∑i=0min(n,k)gi⋅nk−i(k−i)!f(k)=[x^k]F(x)=\sum\limits_{i=0}^{min(n,k)}[x^i]G(x)\cdot [x^{k-i}]e^{nx}=\sum\limits_{i=0}^{min(n,k)}g_i\cdot \frac{n^{k-i}}{(k-i)!}

故答案为∏i=1nai−k!nkf(k)=∏i=1nai−∑i=0min(n,k)gi⋅∏j=k−i+1kjni∏i=1nai−k!nkf(k)=∏i=1nai−∑i=0min(n,k)gi⋅∏j=k−i+1kjni\prod\limits_{i=1}^na_i-\frac{k!}{n^k}f(k)=\prod\limits_{i=1}^na_i-\sum\limits_{i=0}^{min(n,k)}g_i\cdot \frac{\prod\limits_{j=k-i+1}^kj}{n^i}

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=5005;
#define mod 1000000007
int n,k,v[maxn],a[maxn],b[maxn];
void inc(int &x,int y)
{x=x+y>=mod?x+y-mod:x+y;
}
void dec(int &x,int y)
{x=x-y<0?x-y+mod:x-y;
}
int Pow(int a,int b)
{int ans=1;while(b){if(b&1)ans=(ll)ans*a%mod;a=(ll)a*a%mod;b>>=1;}return ans;
}
int main()
{while(~scanf("%d%d",&n,&k)){int ans=1;for(int i=1;i<=n;i++)scanf("%d",&v[i]),ans=(ll)ans*v[i]%mod;a[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<i;j++){inc(b[j],(ll)v[i]*a[j]%mod);dec(b[j+1],a[j]);}for(int j=0;j<=i;j++)a[j]=b[j],b[j]=0;}int m=min(n,k),p=1,q=1,inv=Pow(n,mod-2);for(int i=0;i<=m;i++){dec(ans,(ll)p*a[i]%mod*q%mod);p=(ll)p*(k-i)%mod;q=(ll)q*inv%mod;}printf("%d\n",ans);}return 0;
}

CodeForces 891 E.Lust(生成函数)相关推荐

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

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

  2. 【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​−( ...

  3. Codeforces 891E. Lust 生成函数

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

  4. Codeforces 891E Lust 生成函数

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

  5. 【CF891E】Lust 生成函数

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

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

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

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

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

  8. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 650  Solved: 2 ...

  9. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)

    传送门 题意简述:现在有一些号码由000~999中的某些数字组成(会给出),号码总长度为nnn,问有多少个号码满足前n2\frac n22n​个数码的和等于后n2\frac n22n​个数码的和(保证 ...

最新文章

  1. 钉钉大数据:贵州政府效率意识全国领先
  2. 网络验证常见的攻击方式与防御手段
  3. 打开vsd_低温修正下的CDFA与VSD
  4. python3 bytes和str转换,解决图片base64调用api的问题
  5. adb命令检测apk启动时间、内存、CPU使用情况、流量、电池电量等——常用的adb命令...
  6. 循环序列模型 —— 1.10 长短期记忆(LSTM)
  7. (73)多路选择器(二选一)
  8. python语法基础知识案例_python基础知识理解
  9. 运行时修改Standard shader的Mode
  10. HTML基本标签详解与运行截图
  11. LSH︱python实现MinHash-LSH及MinHash LSH Forest——datasketch(四)
  12. Linux网络配置之虚拟网卡的配置(Red Hat 6.5)
  13. 主曲率、高斯曲率、平均曲率的物理意义及公式
  14. ubuntu处理视频 将视频转换成图片帧
  15. Ansys 2022 安装教程(附赠免费的安装包)
  16. 手机里tencent文件夹能删吗_华为手机中的文件夹代表什么,哪些可以删除,看完秒懂-tencent是什么文件夹...
  17. 我是火枪,我想打dps
  18. VUE3-Cesium(视角操作、时钟设置)
  19. 阿凡达(Avatar)迄今为止最搞笑最靠谱的2个影评
  20. 都有哪些数据恢复软件是免费的?

热门文章

  1. 2023年山东艺术学院设计学院环艺考研上岸前辈初复试备考经验
  2. Android调用打印机
  3. python中判断字母大小写和数字字符串
  4. 用友视频教程NC65 NCV6.5财务供应链生产制造实施用友NC视频教程
  5. 2018年传感器新技术一览
  6. 民办教育上市热潮不减,天有教育是否能跻身第一梯队?
  7. Sharding-JDBC简单使用
  8. 编写程序,解决鸡兔同笼问题:一个笼子里关着鸡和兔子。问笼中各有多少只鸡和兔?
  9. 体素科技丁晓伟:医疗影像的哲学三问
  10. Terminal软件