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表示该公共 ...
随机推荐
- selenium登录豆瓣网
登录流程: 实例化一个driver,然后driver.get()发送请求 最重要的:切换iframe子框架,因为豆瓣的网页中的登录那部分是一个ifrme,必须切换才能寻找到对应元素 利用seleniu ...
- js预解析实例
<script> // f1(); // console.log(c);//9 // console.log(b);//9 // console.log(a);//报错 // functi ...
- lua的数据类型
Lua 是动态(弱)类型的语言,它有一下几种数据结构: nil(空) nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值: print ...
- jvm 中内存的栈和数据结构中的栈的区别
1.常见的数据结构:栈.队列.数组.链表和红黑树,java内存划分 2.JYM中的栈是先进先出,先入栈的先执行: 2.数据结构中的栈是先进后出,类似手枪的弹夹,先进入的子弹最后才发射: 3.数据结构中 ...
- gflags 编译动态库
gflags 编译动态库 这里涉及到gflags的安装,原来使用 sudo apt-get install libgflags-dev 但是后面有人在环境中下载安装了libgflags的安装包,解压后 ...
- postman传数组参数,二维数组,多维数组
一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,
- Semaphore拿到执行权的线程之间是否互斥
java线程之间的控制,使用Semaphore 实现 互斥 下面我们通过Semaphore来实现一个比较好的互斥操作: package com.zhy.concurrency.semaphore; i ...
- PHP之配置
1) 错误日志 一.相关配置 需要将php.ini中的配置指令做如下修改: . error_reporting = E_ALL ;将会向PHP报告发生的每个错误 . display_errors = ...
- JavaScript使用纯函数避免bug
纯函数 一.纯函数 定义:纯函数是指不依赖并且不修改其作用域之外的函数.通过以下几个示例来认识纯函数: var a = 10; //纯函数 function foo(num){ return num ...
- C# 移除数组中重复项
方法一: static void Main(string[] args) { //看到数组的第一反应应该是排序 ,,,,,,,}; //去掉数组中重复的项 //先排序 arrayAsc(array); ...