题目大意

有n个数,进行k轮操作:随机一个i,让\(a_i\)减1,然后ans加上\(\Pi_{j\neq i}a_i\)。

求ans的期望。

分析

发现,造成的伤害就是原来的ai的积减去k轮操作后的ai的积(其实我在看题解前根本没发现)。

题目就变成了求k轮操作后的ai的积的期望。

设ai经过了k轮操作减去了bi

\[E(\Pi_{i=1}^{n}(a_i-b_i))=\dfrac{1}{n^k}\sum_{\sum_{i=1}^{n}b_i=k}\Pi_{i=1}^{n}(a_i-b_i)(a_i-b_i)C_{k}^{b_1}C_{k-b_1}^{b_2}C_{k-b_1-b_2}^{b_3}...
\]

\[=\dfrac{1}{n^k}\sum_{\sum_{i=1}^{n}b_i=k}\Pi_{i=1}^{n}(a_i-b_i)(a_i-b_i)\dfrac{k!}{\Pi_{i=1}^{n}b_i!}
\]

考虑如何求

\[\sum_{\sum_{i=1}^{n}b_i=k}\Pi_{i=1}^{n}(a_i-b_i)(a_i-b_i)\dfrac{1}{\Pi_{i=1}^{n}b_i!}
\]

设生成函数

\[F_i(x)=\sum_{j=0}^{\infty}\dfrac{a_i-j}{j!}x^j=\sum_{j=0}^{\infty}\dfrac{a_i}{j!}x^j-\sum_{j=0}^{\infty}\dfrac{1}{(j-1)!}x^j=(a_i-x)e^x
\]

于是就

\[=\Pi_{i=1}^{n}F_i(x)=e^{nx}\Pi_{i=1}^{n}(a_i-x)
\]

我们就要求出\(e^{nx}\Pi_{i=1}^{n}(a_i-x)\)的第k项的系数

\(\Pi_{i=1}^{n}(a_i-x)\)就可以用分治FFT来求。

然后对于\(\Pi_{i=1}^{n}(a_i-x)\)第i项乘上\(e^{nx}\)第k-i项加起来就是\(e^{nx}\Pi_{i=1}^{n}(a_i-x)\)的第k项的系数了。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <bitset>
#include <set>
#include <vector>
const int inf=2147483647;
const long long mo=998244353;
const int N=400005;
using namespace std;
long long f[20][N],W[N];
int n,m;
long long ans,a[N],ny;
long long poww(long long x,long long y)
{
long long s=1;
for(;y;y>>=1,x=x*x%mo)
if(y&1) s=s*x%mo;
return s;
}
void NTT(long long *f,int fn,int z)
{
for(int i=0,p=0;i<fn;i++)
{
if(i<p) swap(f[i],f[p]);
for(int j=fn>>1;(p^=j)<j;j>>=1);
}
for(int i=2;i<=fn;i<<=1)
{
int half=i>>1,pe=fn/i;
for(int j=0;j<half;j++)
{
long long w0=z?W[j*pe]:W[fn-j*pe];
for(int k=j;k<fn;k+=i)
{
long long x=f[k],y=f[k+half]*w0%mo;
f[k]=(x+y)%mo,f[k+half]=(x-y+mo)%mo;
}
}
}
}
void dc(int deep,int l,int r)
{
if(l==r)
{
f[deep][0]=a[l],f[deep][1]=-1;
return;
}
int mid=(l+r)>>1,fn;
for(fn=1;fn<=r-l+2;fn<<=1); dc(deep+1,l,mid); for(int i=0;i<fn;i++) f[deep][i]=f[deep+1][i],f[deep+1][i]=0; dc(deep+1,mid+1,r); W[0]=1,W[1]=poww(3,(mo-1)/fn);
for(int i=1;i<=fn;i++) W[i]=W[i-1]*W[1]%mo;
NTT(f[deep],fn,1),NTT(f[deep+1],fn,1);
for(int i=0;i<fn;i++) f[deep][i]=f[deep][i]*f[deep+1][i]%mo;
NTT(f[deep],fn,0);
ny=poww(fn,mo-2);
for(int i=0;i<fn;i++) f[deep][i]=f[deep][i]*ny%mo; for(int i=0;i<fn;i++) f[deep+1][i]=0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
dc(1,1,n);
long long val=m;
ny=poww(n,mo-2);
for(int i=1;i<=min(n,m);i++)
{
val=val*ny%mo;
ans=(ans+f[1][i]*val%mo)%mo;
if(m-i>=1) val=val*(m-i)%mo;
}
printf("%lld\n",(mo-ans+mo)%mo);
}

Codeforces Round #446 Div1 E的更多相关文章

  1. Codeforces Round #446 (Div. 2)

    Codeforces Round #446 (Div. 2) 总体:rating涨了好多,虽然有部分是靠和一些大佬(例如redbag和ShichengXiao)交流的--希望下次能自己做出来2333 ...

  2. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  3. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

  4. Codeforces Round #539 Div1 题解

    Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...

  5. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  6. Codeforces Round #253 DIV1 C 馋

    http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...

  7. Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)

    题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...

  8. Codeforces Round #206 div1 C

    CF的专业题解 : The problem was to find greatest d, such that ai ≥ d,  ai mod d ≤ k holds for each i. Let ...

  9. Codeforces Round#201(div1) D. Lucky Common Subsequence

    题意:给定两个串,求出两个串的最长公共子序列,要求该公共子序列不包含virus串. 用dp+kmp实现 dp[i][j][k]表示以i结尾的字符串和以j结尾的字符串的公共子序列的长度(其中k表示该公共 ...

随机推荐

  1. kubectl相关指令

    在列出.描述.修改或删除其他命名空间中的对象时,需要给kubect1命令传递--namespace(或-n)选项.如果不指定命名空间,kubect1将在当前上下文中配置的默认命名空间中执行操作.而当前 ...

  2. SpringBoot起飞系列-自定义starter(十)

    一.前言 到现在,我们可以看出来,如果我们想用一些功能,基本上都是通过添加spring-boot-starter的方式来使用的,因为各种各样的功能都被封装成了starter,然后把相关服务注入到容器中 ...

  3. 洛谷P1088 火星人

    //其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...

  4. Linux就该这么学——新手必须掌握的命令之系统状态检测命令组

    ifconfig命令 用途 : 获取网卡配置与网络状态等信息 格式 : ifconfig[网络设备][参数] 其实主要查看的就是网卡名称,inet参数后面的IP地址,ether参数后面的网卡物理地址( ...

  5. PyCharm 格式化代码 常用快捷键

    ctrl+alt+L 一 常用快捷键 编辑类:Ctrl + D             复制选定的区域或行Ctrl + Y           删除选定的行Ctrl + Alt + L     代码格 ...

  6. linux命令 ip

  7. [IOI2005]Riv河流

    题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...

  8. codeforce C. Success Rate

    写完这道题目才发现自己对二分的理解太浅了 这题是典型的利用二分“假定一个问题可行并求最优解” 二分是通过不断缩小区间来缩小解的范围,最终得出解的算法 我们定义一个c(x) 表示判断函数 如果对任意y& ...

  9. Winform_chart控件_心得

    效果图: 1.首先,在工具箱找到chart控件,拖到窗体中. 2.关于chart控件的细节设计: series集合设计: chartType可以选择折线图.柱状图.圆饼图等等. isValueShow ...

  10. Resource通配符路径 ——跟我学spring3

    转自: https:// jinnianshilongnian.iteye.com/blog/1416322