Codeforces Round #446 Div1 E
题目大意
有n个数,进行k轮操作:随机一个i,让\(a_i\)减1,然后ans加上\(\Pi_{j\neq i}a_i\)。
求ans的期望。
分析
发现,造成的伤害就是原来的ai的积减去k轮操作后的ai的积(其实我在看题解前根本没发现)。
题目就变成了求k轮操作后的ai的积的期望。
设ai经过了k轮操作减去了bi
\]
\]
考虑如何求
\]
设生成函数
\]
于是就
\]
我们就要求出\(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的更多相关文章
- Codeforces Round #446 (Div. 2)
Codeforces Round #446 (Div. 2) 总体:rating涨了好多,虽然有部分是靠和一些大佬(例如redbag和ShichengXiao)交流的--希望下次能自己做出来2333 ...
- Codeforces Round #543 Div1题解(并不全)
Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...
- Codeforces Round #545 Div1 题解
Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...
- Codeforces Round #539 Div1 题解
Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- Codeforces Round #253 DIV1 C 馋
http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...
- Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)
题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...
- 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 ...
- Codeforces Round#201(div1) D. Lucky Common Subsequence
题意:给定两个串,求出两个串的最长公共子序列,要求该公共子序列不包含virus串. 用dp+kmp实现 dp[i][j][k]表示以i结尾的字符串和以j结尾的字符串的公共子序列的长度(其中k表示该公共 ...
随机推荐
- Nginx整合Tomcat
现在先不考虑集群的配置问题,只实现Nginx实现一台tomact的代理 1.我们需要一个web项目,这里我把先准备好的web.war文件部署到Tomact服务器上 mvn clean install ...
- Hadoop_常用命令(hdfs上)
Hadoop_常用命令(hdfs上) hadoop fs所有文件系统都可以使用 hdfs dfs仅针对于hdfs文件系统 - 1 - 查看所有目录(文件夹)及文件 hdfs dfs -ls / - ...
- 图解django的生命周期
其实django的生命周期的大体框架就是这样,剩下的细致的,自己再补充! 图片实在是有点抽象! 谅解!! koala-----给你更多技术小干货
- http请求之of_ordering_json
//Public function of_ordering_json (string as_json,ref string as_jsons[]) returns integer //string a ...
- C# HttpWebRequest向远程地址Post文件
HttpWebRequest向远程地址Post文件 /// <summary> /// 上传文件到远程服务器 /// </summary> /// <param name ...
- Vue用递归实现一个消除输入框表情符的自定义directive
最近项目中有一个需求,所有的文本输入框需要过滤掉表情符号,但是觉得每次表单验证的时候去判断,有点麻烦.于是我想到了自定义一个指令,后续遇到需要删除表情符号的输入框,直接通过指令将表情符号删除就好了,方 ...
- Java Web DNS域名解析
一.什么是DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串 ...
- MFC六大核心机制
MFC六大核心机制概述 我们选择了C++,主要是因为它够艺术.够自由,使用它我们可以实现各种想法,而MFC将多种可灵活使用的功能封装起来,我们岂能忍受这种“黑盒”操作?于是研究分析MFC的核心机制成为 ...
- javascript的特点这些
javascript的特点(1)用于解释性执行的脚本语言.与其他脚本语言一样,JavaScript也是一种解释性语言,它提供了非常方便的开发过程.JavaScript的基本语法结构与C.C++.Jav ...
- day8 socket
代码: 例子1:socket tcp 通讯 server端 import socketserver = socket.socket()ip_port = ("127.0.0.1", ...