Codeforces 891E - Lust(生成函数)
NaCly_Fish:《简单》的生成函数题
然鹅我连第一步都没 observe 出来
首先注意到如果我们按题意模拟那肯定是不方便计算贡献的,因此考虑对题目的问法进行一些转化。《显然》,对于一种操作序列而言,其操作完之后答案的值,就是原来 \(a_i\) 的乘积减去操作后所有 \(a_i\) 的乘积,因为每次操作前后答案与所有 \(a_i\) 的乘积之和是个定值。因此问题可以转化为,求操作之后所有 \(a_i\) 的乘积的期望值。如果我们设 \(c_i\) 表示第 \(i\) 个数被操作的次数,那么操作之后 \(a_i\) 的乘积的期望值可以表示为
\]
那么答案即为 \(\prod\limits_{i=1}^na_i-E(P)\)
考虑怎样求这个东西,注意到这里出现了 \(\sum c_i=k\),因此我们可以很自然地想到生成函数,又因为每次选择的位置是有顺序的,故此题涉及的是排列而不是组合问题,因此本题应采用 EGF,具体来说我们构造指数型生成函数 \(F_i(x)=\sum\limits_{v\ge 0}\dfrac{a_i-v}{v!}x^v\),那么重新审视一下上面的式子就可以得到
\]
直接把 \(F_i(x)\) 卷起来显然不合适,不过注意到这东西好像能跟 \(e^x\) 扯上关系,因此考虑化简:
F_i(x)&=\sum\limits_{v\ge 0}\dfrac{a_i-v}{v!}x^v\\
&=\sum\limits_{v\ge 0}\dfrac{a_ix^v}{v!}-\sum\limits_{v\ge 1}\dfrac{x^v}{(v-1)!}\\
&=a_i\sum\limits_{v\ge 0}\dfrac{x^v}{v!}-x\sum\limits_{v\ge 0}\dfrac{x^v}{v!}\\
&=(a_i-x)e^x
\end{aligned}
\]
带回去
\]
考虑后面那个多项式
\]
我们考虑枚举其贡献给 \([x^k]\) 的系数,即
\]
即
\]
带回去
\]
即
\]
\(G(x)\) 的系数可以分治 NTT 做到 \(\mathcal O(n\log^2n)\),不过对于此题而言没有必要,\(n^2\) 递推即可。
const int MAXN=5000;
const int MOD=1e9+7;
int n,k,dp[MAXN+5];
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int main(){
scanf("%d%d",&n,&k);dp[0]=1;
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
for(int j=i;~j;j--) dp[j]=(1ll*x*dp[j]-((!j)?0:dp[j-1])+MOD)%MOD;
} int ivn=qpow(n,MOD-2),res=dp[0];
for(int i=0,mul=1,pw=1;i<=n;i++){
res=(res-1ll*mul*dp[i]%MOD*pw%MOD+MOD)%MOD;
mul=1ll*mul*(k-i)%MOD;pw=1ll*pw*ivn%MOD;
}
printf("%d\n",res);
return 0;
}
Codeforces 891E - Lust(生成函数)的更多相关文章
- 【CF891E】Lust 生成函数
[CF891E]Lust 题意:给你一个长度为n的序列$a_i$,对这个序列进行k次操作,每次随机选择一个1到n的数x,令$res+=\prod\limits_{i!=x}a_i$(一开始res=0) ...
- CF891E Lust 生成函数
传送门 设在某一次操作之后的\(a\)数组变为了\(a'\)数组,那么\(\prod\limits_{i \neq x} a_i = \prod a_i - \prod a_i'\).那么就不难发现我 ...
- Codeforces 438E The Child and Binary Tree [DP,生成函数,NTT]
洛谷 Codeforces 思路 看到计数和\(998244353\),可以感觉到这是一个DP+生成函数+NTT的题. 设\(s_i\)表示\(i\)是否在集合中,\(A\)为\(s\)的生成函数,即 ...
- Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式
题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...
- [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 28 ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)
Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...
- [CodeForces - 712D]Memory and Scores (DP 或者 生成函数)
题目大意: 两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高. ( ...
- Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]
CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...
随机推荐
- 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析
SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...
- 【Docker】(11)---Docker的网络概念
一.实现原理 1.实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为C ...
- Unity——计时器功能实现
Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- 洛谷 P5664 [CSP-S2019] Emiya 家今天的饭
链接: P5664 题意: 给出一个 \(n*m\) 的矩阵 \(a\),选 \(k\) 个格子(\(1\leq k\leq n\)),每行最多选一个,每列最多选\(⌊\dfrac k2⌋\) 个,同 ...
- Python import commands ImportError: No module named 'commands'
ImportError: No module named 'commands' 在Python3中执行shell脚本,想要获取其执行状态和标准输出.错误输出 的数据,遇到这个错误,原因是command ...
- populating-next-right-pointers-in-each-node-ii leetcode C++
Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...
- 0x04
二分: while(l<r) { int mid=(l+r)/2; if(符合条件) r=mid; else l=mid+1; } 固定下二分的写法: 终止条件:l==r: 取mid=(l+r) ...
- (1)Zookeeper在linux环境中搭建集群
1.简介 ZooKeeper是Apache软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册.ZooKeeper的架构通过冗余服务实现高可用性.Zookeeper ...
- Labview一个循环中放两个事件结构会导致前面板锁定的问题
建议在同一个循环中,只放置一个事件结构.此时,当一个事件发生时,事件结构将对事件进行处理,然后继续循环,事件结构再等待下一个事件发生. 如在同一个循环中放置两个事件结构,只有在两个事件结构都处理了事件 ...