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表示该公共 ...
随机推荐
- Git--上手Github
1.创建远程仓库 无论在之后的第二步你是想从本地到远程还是远程到本地,创建远程仓库是第一步肯定的.(推荐克隆本地,然后把本地的代码拷入,然后add push) 因为clone ,github会帮忙创建 ...
- odoo10实现单点登陆绕过登陆集成页面
背景:由于需要集成odoo平台在其他页面,需要绕开登陆. 解决办法:开辟一个自动登陆的路由用与集成页面. 1.修改web模块中controller/main.py文件,在class名字为Home中添加 ...
- Java的四层结构dto、dao、service、controller
首先,最底层的就是dto层,dto层就是所谓的model,dto中定义的是实体类,也就是.class文件,该文件中包含实体类的属性和对应属性的get.set方法:<bean> 其次,是da ...
- stalstack
Saltstack 是干什么的 saltstack 是一个开源异构平台基础设置管理工具 Saltstack 能干什么 如果是一个管理成千上百服务器的管理员,你会遇到场景 需要在每台服务器上面部署age ...
- Java EE javax.servlet中的ServletResponse接口
ServletResponse接口 public interface ServletResponse 子接口:HttpServletResponse 实现类:HttpServletResponseWr ...
- Datetime 在C#中的用法 获取当前时间的各种格式
DateTime 获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = ...
- Visual Studio高分屏下Winform界面变形
现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...
- mvc验证码图片生成
/// <summary> ///生成验证码 /// </summary> public class VerifyCode { /// <summary> /// ...
- httpclient 多附件上传
多附件上传实例: /** * 多附件上传 * @param host * @param uri * @param attachment 附件 * @param param body参数 * @retu ...
- Vue异步请求最佳实践
一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...