传送门

考虑每次贡献可以差分成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​−(aj​−1)∏i​=j​ai​
那么可以发现最后答案就是∏iai−E(∏idi),di表示操作完后的ai\prod_{i}a_i-E(\prod_{i}d_i),d_i表示操作完后的a_i∏i​ai​−E(∏i​di​),di​表示操作完后的ai​
考虑求后面一块
显然可以构造生成函数
ft(x)=∑i=0∞(at−i)xii!f_t(x)=\sum_{i=0}^{\infty}\frac{(a_t-i)x^i}{i!}ft​(x)=i=0∑∞​i!(at​−i)xi​
求得就是就是k!nk[xk]∏ifi(x)\frac{k!}{n^k}[x^k]\prod_if_i(x)nkk!​[xk]∏i​fi​(x)
考虑ft(x)=at∑ixii!−∑ixi+1i!=(at−x)exf_t(x)=a_t\sum_{i}\frac{x^i}{i!}-\sum_i\frac{x^{i+1}}{i!}=(a_t-x)e^xft​(x)=at​∑i​i!xi​−∑i​i!xi+1​=(at​−x)ex
那么考虑最后乘出来的多项式为enx(∏t(at−x))=enx∑igixie^{nx}(\prod_{t}(a_t-x))=e^{nx}\sum_{i}g_ix^ienx(∏t​(at​−x))=enx∑i​gi​xi
那么就是k!nk∑i=0nfi∗nk−i(k−i)!=ki‾fi/ni\frac{k!}{n^k}\sum_{i=0}^nf_i*\frac{n^{k-i}}{(k-i)!}=k^{\underline i}f_i/n^inkk!​∑i=0n​fi​∗(k−i)!nk−i​=ki​fi​/ni

暴力做多项式乘法是O(n2)O(n^2)O(n2)
如果写mttmttmtt可以做到O(nlog2n)O(nlog^2n)O(nlog2n)

#include<bits/stdc++.h>
using namespace std;
#define cs const
#define re register
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define fi first
#define se second
#define bg begin
cs int RLEN=1<<20|1;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(){char ch=gc();int res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
inline ll readll(){char ch=gc();ll res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
inline int readstring(char *s){int top=0;char ch=gc();while(isspace(ch))ch=gc();while(!isspace(ch)&&ch!=EOF)s[++top]=ch,ch=gc();return top;
}
template<typename tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<typename tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int mod=1e9+7;
inline int add(int a,int b){return (a+=b)>=mod?(a-mod):a;}
inline int dec(int a,int b){a-=b;return a+(a>>31&mod);}
inline int mul(int a,int b){static ll r;r=1ll*a*b;return (r>=mod)?(r%mod):r;}
inline void Add(int &a,int b){(a+=b)>=mod?(a-=mod):0;}
inline void Dec(int &a,int b){a-=b,a+=a>>31&mod;}
inline void Mul(int &a,int b){static ll r;r=1ll*a*b;a=(r>=mod)?(r%mod):r;}
inline int ksm(int a,int b,int res=1){for(;b;b>>=1,Mul(a,a))(b&1)&&(Mul(res,a),1);return res;}
inline int Inv(int x){return ksm(x,mod-2);}
inline int fix(int x){return (x<0)?x+mod:x;}
cs int N=5005;
int f[N],n,k;
int a[N];
int main(){#ifdef Stargazerfreopen("lx.in","r",stdin);#endifn=read(),k=read();f[0]=1;int res=1;for(int i=1;i<=n;i++){int x=read();Mul(res,x);for(int j=i;~j;j--){Mul(f[j],x);if(j)Dec(f[j],f[j-1]);}}for(int pw1=1,pw2=1,mt=Inv(n),i=0;i<=n;i++){Dec(res,mul(pw1,mul(pw2,f[i])));Mul(pw1,k-i),Mul(pw2,mt);}cout<<res<<'\n';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(生成函数)

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

  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. 怎么理解python的__init___理解Python中super()和__init__()方法
  2. cs-HtmlHelpers
  3. python 读写函数
  4. WSL2——Linux C中进程相关操作编程问题
  5. java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
  6. ubantu实现linux命令的实验_linux 基础知识
  7. Java基础(五):数组和Java方法
  8. Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招
  9. el-tree多选获取选中的节点ID
  10. vue解决跨域问题(Vue-CLI)
  11. 全网最详细的零基础动态web项目集成mybatis框架实现增删改查系统(案例+源码)
  12. 电脑dns服务器未响应该怎么操作,电脑DNS服务器未响应该怎么办
  13. 集团企业邮箱申请哪家的好,怎么选择?
  14. 孙溟㠭篆刻《无有中无尽藏》
  15. JavaWeb、前端三剑客
  16. 消防法及相关法律法规(一)
  17. 【上市啦】“Python 之父” 力荐的蓝皮书,你知道是哪本吗?
  18. 尤克里里好不好学?只要3招!没有音乐基础的小白也能轻松上手
  19. 微信公众号如何实现视频列表播放视频的功能
  20. Unity中屏幕坐标与世界坐标之间的转换

热门文章

  1. z590和z490的区别 哪个好
  2. 码住这些视频配音软件,一键完成配音
  3. 计算机教师资格教案,小学信息技术教师资格证面试教案:操作系统新相识
  4. 健身课Day03-单侧臀腿力量训练
  5. 电脑内存过大,如何处理
  6. 瞬渺光电代理THZ光谱仪成功客户
  7. 量子计算机与易经,易经卦象的演化过程,就是一个量子计算机模型?
  8. opencv实现行人检测(C++)
  9. 判断tvs能抗住多少千伏浪涌的依据_TVS管主要参数说明及作用
  10. Python语法速记