文章目录

  • 题目
  • 思路
  • 代码

题目

你有n个数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ ,要进行 kkk 次操作,每次在 111 ~ nnn 中随机选择一个数 xxx,使得res+=∏i!=xaires+=\prod_{i!= x}a_ires+=∏i!=x​ai​ ,然后 axa_xax​ 减少 111,求最后 resresres 值的期望,答案对 109+710^9+7109+7 取模。
数据范围:
1≤n≤5000,1≤k≤109,0≤ai≤1091\le n\le 5000,1\le k \le 10^9,0\le a_i\le 10^91≤n≤5000,1≤k≤109,0≤ai​≤109

思路

我们考虑在某一个局面即将进行一次操作:
记现在 aia_iai​ 减少的次数为 bib_ibi​ ,我们选中 axa_xax​
那我们计算一次答案贡献:
∏i!=x(ai−bi),同时bx+=1\prod_{i!=x}(a_i-b_i),同时b_x+=1i!=x∏​(ai​−bi​),同时bx​+=1
那么我们变形
((ax−bx)−(ax−(bx+1)))∗∏i!=x(ai−bi)((a_x-b_x)-(a_x-(b_x+1)))*\prod_{i!=x}(a_i-b_i)((ax​−bx​)−(ax​−(bx​+1)))∗i!=x∏​(ai​−bi​)
∏i=1n(ai−bi)−(∏i=1n(ai−bi))∗(ax−(bx+1))\prod_{i=1}^n(a_i-b_i)-(\prod_{i=1}^n(a_i-b_i))*(a_x-(b_x+1))i=1∏n​(ai​−bi​)−(i=1∏n​(ai​−bi​))∗(ax​−(bx​+1))
我们记某一个局面 α=(b1,b2,...,bn)\alpha=(b_1,b_2,...,b_n)α=(b1​,b2​,...,bn​)
我们记 f(α)=∏i=1n(ai−bi)f(\alpha)=\prod_{i=1}^n(a_i-b_i)f(α)=i=1∏n​(ai​−bi​)
那么一次的贡献为: f(α)−f(β)f(\alpha)-f(\beta)f(α)−f(β)
初局面:
f(start)=∏i=1naif(start)=\prod_{i=1}^na_if(start)=i=1∏n​ai​
于是类似于裂项相消的样子,我们只剩初局面和末局面


E=f(start)−∑k!nk∗∏i=1nbi!∗f(end)E=f(start)-\sum\frac{k!}{n^k*\prod_{i=1}^nb_i!}* f(end)E=f(start)−∑nk∗∏i=1n​bi​!k!​∗f(end)
于是我们只需保证:∑i=1nbi=k\sum_{i=1}^nb_i=k∑i=1n​bi​=k,
化简后半段
∑k!nk∗∏i=1nbi!∗∏i=1(ai−bi)=k!nk∗∑∏i=1ai−bibi!\sum\frac{k!}{n^k*\prod_{i=1}^nb_i!}*\prod_{i=1}(a_i-b_i)=\frac{k!}{n^k}*\sum\prod_{i=1}\frac{a_i-b_i}{b_i!}∑nk∗∏i=1n​bi​!k!​∗i=1∏​(ai​−bi​)=nkk!​∗∑i=1∏​bi​!ai​−bi​​
发现这个似乎很难搞,我们考虑化简和指数型母函数构造:
G(x)=∏i=1n∑j=0+∞ai−jj!xjG(x)=\prod_{i=1}^n\sum_{j=0}^{+\infty}\frac{a_i-j}{j!}x^jG(x)=i=1∏n​j=0∑+∞​j!ai​−j​xj
=∏i=1n∑j=0+∞(aij!xj−jj!xj)=\prod_{i=1}^n\sum_{j=0}^{+\infty}(\frac{a_i}{j!}x^j-\frac{j}{j!}x^j)=i=1∏n​j=0∑+∞​(j!ai​​xj−j!j​xj)
=∏i=1n(∑j=0+∞aij!xj−∑j=0+∞xj!xj)=\prod_{i=1}^n(\sum_{j=0}^{+\infty}\frac{a_i}{j!}x^j-\sum_{j=0}^{+\infty}\frac{x}{j!}x^j)=i=1∏n​(j=0∑+∞​j!ai​​xj−j=0∑+∞​j!x​xj)
=∏i=1n((ai−x)∗∑j=0+∞xjj!)=\prod_{i=1}^n((a_i-x)*\sum_{j=0}^{+\infty}\frac{x^j}{j!})=i=1∏n​((ai​−x)∗j=0∑+∞​j!xj​)
=∏i=1n((ai−x)∗ex)=\prod_{i=1}^n((a_i-x)*e^x)=i=1∏n​((ai​−x)∗ex)
=enx∏i=1n(ai−x)=e^{nx}\prod_{i=1}^n(a_i-x)=enxi=1∏n​(ai​−x)
我们的目标是求 G(x)G(x)G(x) 的第 kkk 项系数 fkf_kfk​,考虑将后面直接 O(n2)O(n^2)O(n2) 拆成多项式形式(当然你会分治FFT O(nlog2n)O(nlog^2n)O(nlog2n)):
G(x)=enx∗∑i=0nci∗xiG(x)=e^{nx}*\sum_{i=0}^nc_i*x^iG(x)=enx∗i=0∑n​ci​∗xi
前面拆开:
G(x)=(1+nx1!+(nx)22!+...)∗∑i=0nci∗xiG(x)=(1+\frac{nx}{1!}+\frac{(nx)^2}{2!}+...)*\sum_{i=0}^nc_i*x^iG(x)=(1+1!nx​+2!(nx)2​+...)∗i=0∑n​ci​∗xi
我们要求第 kkk 项的系数 gkg_kgk​:
gk=∑i=0nci∗nk−i(k−i)!g_k=\sum_{i=0}^nc_i*\frac{n^{k-i}}{(k-i)!}gk​=i=0∑n​ci​∗(k−i)!nk−i​
回代到答案的后半段:
k!nk∗∑∏i=1ai−bibi!=k!nk∗gk\frac{k!}{n^k}*\sum\prod_{i=1}\frac{a_i-b_i}{b_i!}=\frac{k!}{n^k}*g_knkk!​∗∑i=1∏​bi​!ai​−bi​​=nkk!​∗gk​
=k!nk∗∑i=0nci∗nk−i(k−i)!=\frac{k!}{n^k}*\sum_{i=0}^nc_i*\frac{n^{k-i}}{(k-i)!}=nkk!​∗i=0∑n​ci​∗(k−i)!nk−i​
我们知道 nnn 相较于 kkk 很小 于是继续化简:
=∑i=0nci∗Akini=\sum_{i=0}^nc_i*\frac{A_k^i}{n^i}=i=0∑n​ci​∗niAki​​
最后这个式子我们可以考虑递推 O(n)O(n)O(n) 计算
总时间复杂度:O(n2)/O(nlog2n)O(n^2)/O(nlog^2n)O(n2)/O(nlog2n)

代码

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<ctime>
#include<bitset>
#include<vector>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define ULL unsigned long long
LL read(){LL f=1,x=0;char c=getchar();while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}while('0'<=c&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();return f*x;
}
#define MAXN 5000
#define INF 0x3f3f3f3f
#define Mod (LL)(1e9+7)
LL Pow(LL x,LL y){LL ret=1;while(y){if(y&1) ret=ret*x%Mod;x=x*x%Mod;y>>=1;}return ret;
}
LL a[MAXN+5],b[MAXN+5],c[MAXN+5];
int main(){LL n=read(),k=read(),ans=1;for(int i=1;i<=n;i++)a[i]=read(),ans=ans*a[i]%Mod;c[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<i;j++)b[j]=c[j]*a[i]%Mod;for(int j=0;j<i;j++)b[j+1]=(b[j+1]-c[j]+Mod)%Mod;memcpy(c,b,sizeof(c));}LL f=0,t1=1,t2=1,invn=Pow(n,Mod-2);for(int i=0;i<=n;i++){f=(f+c[i]*t1%Mod*t2%Mod)%Mod;t1=t1*(k-i)%Mod,t2=t2*invn%Mod;}ans=(ans-f)%Mod;printf("%lld\n",(ans+Mod)%Mod);return 0;
}

Lust(Codeforces Round #446 Div.1-891E)(母函数\生成函数)相关推荐

  1. Codeforces Round #446 (Div. 1) B. Gluttony 构造 + 补集思想

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,保证aaa中每个数都互不相同,让你构造一个数组bbb,满足对于任意的S=x1,x2,...,xk,1≤xi≤n,0≤k<nS={x_ ...

  2. 【Codeforces Round #446 (Div. 2) C】Pride

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想一下,感觉最后的结果肯定是从某一段开始,这一段的gcd为1,然后向左和向右扩散的. 则枚举那一段在哪个地方. 我们设这一段中所有的 ...

  3. Codeforces Round #446 (Div. 2)

    A. Greed time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  4. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  5. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  6. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  7. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  8. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  9. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

最新文章

  1. np301串口服务器修改ip,NP301         1路RS-232/485/422 TCP/IP  串口服务器
  2. 【Android 应用开发】 自定义 圆形进度条 组件
  3. Logistic Regression 模型简介
  4. 征集活动 | PMCAFF八周年,十万产品经理送祝福
  5. 韩国的计算机科学家,韩国科学技术院用普通相机为AR/VR复刻真实世界物理对象...
  6. chrome postman插件_收集了一些Chrome插件神器,助你快速成为老司机
  7. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(1)--RANRAC
  8. Linux系统下软件包管理六
  9. 二叉树与树、森林之间的转换
  10. 赛门铁克发布第21期《互联网安全威胁报告》 揭示当前更为严峻的网络威胁现状...
  11. mtk添加更换华大北斗gps驱动
  12. STLink连接与资源下载
  13. 珠峰 - 郭永峰react课程 node es6 babel学习笔记
  14. 本地编译 全志a33 的步骤
  15. 通过DLL文件实现函数共有及通过调用_stdcall来减少程序文件的大小
  16. 解决win10下Photoshop2018CC手绘板画画变上下
  17. Android 10.0 蓝牙去掉传输文件的功能
  18. 在SQL Server 2000中设置OPTION (MAXDOP 1) 性能提高问题
  19. viper4android io错误,Go之Viper
  20. MQL4读取hst文件代码范例

热门文章

  1. Unable to locate tools jar Expected to find it in C /Progra
  2. 长沙小学计算机老师,2019下半年湖南长沙小学信息技术教师资格证面试试题考什么内容...
  3. ZOL桌面壁纸的提取
  4. 深圳Web前端学习:5G对Web前端发展的影响--千锋
  5. 关于px/rem/vw 之间的换算关系
  6. linux密匙登录免密码登录,另外推荐一个免费的vps网站
  7. [Demo示例]爬取豆瓣FM个人收藏歌曲“红心列表”
  8. 如何拥有一部属于自己的公网云服务器
  9. 图像超分辨率——LapSRN2017
  10. 霍因科技Hi-ETA Hi-SEAHILL加速大数据管理 赋能信创生态建设