Codeforces 题面传送门 & 洛谷题面传送门

NaCly_Fish:《简单》的生成函数题

然鹅我连第一步都没 observe 出来

首先注意到如果我们按题意模拟那肯定是不方便计算贡献的,因此考虑对题目的问法进行一些转化。《显然》,对于一种操作序列而言,其操作完之后答案的值,就是原来 \(a_i\) 的乘积减去操作后所有 \(a_i\) 的乘积,因为每次操作前后答案与所有 \(a_i\) 的乘积之和是个定值。因此问题可以转化为,求操作之后所有 \(a_i\) 的乘积的期望值。如果我们设 \(c_i\) 表示第 \(i\) 个数被操作的次数,那么操作之后 \(a_i\) 的乘积的期望值可以表示为

\[E(P)=\dfrac{1}{n^k}·\sum\limits_{\sum c_i=k}\dbinom{k}{c_1,c_2,\cdots,c_n}\prod\limits_{i=1}^n(a_i-c_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\),那么重新审视一下上面的式子就可以得到

\[E(p)=\dfrac{k!}{n^k}[x^k]\prod\limits_{i=1}^nF_i(x)
\]

直接把 \(F_i(x)\) 卷起来显然不合适,不过注意到这东西好像能跟 \(e^x\) 扯上关系,因此考虑化简:

\[\begin{aligned}
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}
\]

带回去

\[\dfrac{k!}{n^k}[x^k]e^{nx}\prod\limits_{i=1}^n(a_i-x)
\]

考虑后面那个多项式

\[G(x)=\prod\limits_{i=1}^n(a_i-x)
\]

我们考虑枚举其贡献给 \([x^k]\) 的系数,即

\[[x^k]e^xG(x)=\sum\limits_{i=0}^n[x^i]G(x)·[x^{k-i}]e^{nx}
\]

\[[x^k]e^xG(x)=\sum\limits_{i=0}^n[x^i]G(x)·\dfrac{n^{k-i}}{(k-i)!}
\]

带回去

\[\dfrac{k!}{n^k}\sum\limits_{i=0}^n[x^i]G(x)·\dfrac{n^{k-i}}{(k-i)!}
\]

\[\sum\limits_{i=0}^n\dfrac{k!}{n^i(k-i)!}\sum\limits_{i=0}^n[x^i]G(x)
\]

\(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(生成函数)的更多相关文章

  1. 【CF891E】Lust 生成函数

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

  2. CF891E Lust 生成函数

    传送门 设在某一次操作之后的\(a\)数组变为了\(a'\)数组,那么\(\prod\limits_{i \neq x} a_i = \prod a_i - \prod a_i'\).那么就不难发现我 ...

  3. Codeforces 438E The Child and Binary Tree [DP,生成函数,NTT]

    洛谷 Codeforces 思路 看到计数和\(998244353\),可以感觉到这是一个DP+生成函数+NTT的题. 设\(s_i\)表示\(i\)是否在集合中,\(A\)为\(s\)的生成函数,即 ...

  4. Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式

    题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...

  5. [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 ...

  6. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  7. Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)

    Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...

  8. [CodeForces - 712D]Memory and Scores (DP 或者 生成函数)

    题目大意: 两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高.  ( ...

  9. Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]

    CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...

随机推荐

  1. 安装pytorch后import torch显示no module named 'torch'

    问题描述:在pycharm终端里通过pip指令安装pytorch,显示成功安装但是python程序和终端都无法使用pytorch,显示no module named 'torch'. 起因:电脑里有多 ...

  2. MySQL:提高笔记-3

    MySQL:提高笔记-3 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3,本文 说明:这是根据 bilibi ...

  3. 6月2日 Scrum Meeting

    日期:2021年6月2日 会议主要内容概述: 取消账单类别自定义 图表属性分析取消函数输入 增加新的主题模板 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇 ...

  4. BUAA软工-结对项目

    BUAA2020 软件工程-结对项目 Author:17373015 乔玺华 学号 cnblog profile 17373260(本文作者) Prime21 17373015(结对队友)       ...

  5. STM32串口USART的使用方法和程序

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...

  6. VIVADO 2017.4配置MIG IP注意事项

    1.2GB的single rank SODIMMs配置pin还是和以前一样没有问题: 2.8GB SODIMMs配置pin需要注意4点: (1).所有的DDR3引脚都需要在连续的BANK上,例如Z71 ...

  7. Python 字符串的encode与decode

    python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...

  8. cf13A Numbers(,,)

    题意: Little Petya likes numbers a lot. He found that number 123 in base 16 consists of two digits: th ...

  9. hdu 1848 Fibonacci again and again (SG)

    题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. ...

  10. 面试官:JavaScript如何实现数组拍平(扁平化)方法?

    面试官:JavaScript如何实现数组拍平(扁平化)方法? 1 什么叫数组拍平? 概念很简单,意思是将一个"多维"数组降维,比如: // 原数组是一个"三维" ...