题目大意:你有$n$个操作和一个初始为$0$的变量$x$。

第$i$个操作为:以$P_i$的概率给$x$加上$A_i$,剩下$1-P_i$的概率给$x$乘上$B_i$。

你袭击生成了一个长度为$n$的排列$C$,并以此执行了第$C_1,C_2....C_n$个操作。

求执行完所有操作后,变量$x$的期望膜$998244353$的值。

数据范围:$n≤10^5,0≤P,A,B<998244353$

我太菜了

考虑如果并没有排列的要求,而是强行依次执行,会发生什么事情:

令$X_i$表示执行完前$i$个操作后$x$的期望。

则有:

$X_i=P_i\times (X_{i-1}+A_i)+(1-P_i)\times X_{i-1}\times B_i$

我们经过化简,得到:

$X_i=(P_i+B_i-P_i\times B_i)X_{i-1}+A_i\times B_i$

这个不就是一个一次函数吗?我们姑且将这个称为$F_i(x)$,我们将它表示为$F_i(x)=D_ix+E_i$

那么在不考虑顺序的情况下,则有:

$X_n=F_1(F_2(...F_n(0)...))$

然而求答案的时候,函数排列的顺序是随机的,对于任意的$i≠j$,函数i排在函数j前面的概率都是$\frac{1}{2}$。

我们只需要求出,对于每个$E_i$,套在$F_i(x)$外面的函数的积的期望。

基于这些,则有:

$X_n=\frac{1}{n!}\sum \limits_{i=1}^{n} E_i \sum \limits_{j=1}^{n} [x^j] \prod \limits_{k=1,k\not\equiv i}^{n}(1+D_k)$

然后,我们通过分治FFT求解这个式子即可。

 #include<bits/stdc++.h>
#define MOD 998244353
#define G 3
#define L long long
#define M 262144
using namespace std; L pow_mod(L x,L k){L ans=; for(;k;k>>=,x=x*x%MOD) if(k&) ans=ans*x%MOD; return ans;}
void chage(int a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
inline int pls(int a,int b){return a+b>=MOD?a+b-MOD:a+b;}
inline int mns(int a,int b){return a<b?a-b+MOD:a-b;}
void NTT(int a[],int n,int on){
chage(a,n);
for(int h=;h<=n;h<<=){
int wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
int w=;
for(int k=j;k<j+(h>>);k++){
int u=a[k],t=1LL*a[k+(h>>)]*w%MOD;
//a[k]=(u+t)%MOD; a[k+(h>>1)]=(u-t+MOD)%MOD;
a[k]=pls(u,t); a[k+(h>>)]=mns(u,t);
w=1LL*w*wn%MOD;
}
}
}
if(on==-){
L inv=pow_mod(n,MOD-);
reverse(a+,a+n);
for(int i=;i<n;i++) a[i]=1LL*a[i]*inv%MOD;
}
}
void MUL(int ans[],int a[],int lena,int b[],int lenb){
static int t1[M],t2[M];
int len=; while(len<=lena+lenb) len<<=;
memset(t1,,len<<); memcpy(t1,a,(lena+)<<);
memset(t2,,len<<); memcpy(t2,b,(lenb+)<<);
NTT(t1,len,); NTT(t2,len,);
for(int i=;i<len;i++) t1[i]=1LL*t1[i]*t2[i]%MOD;
NTT(t1,len,-);
memcpy(ans,t1,(lena+lenb+)<<);
} L D[M]={},E[M]={},fac[M]={};
void solve(int f[],int g[],int l,int r){
static int h[M];
if(l==r) return f[]=E[l],g[]=D[l],g[]=,void();
int mid=(l+r)>>,lenl=mid-l+,lenr=r-mid;
solve(f,g,l,mid); solve(f+lenl+,g+lenl+,mid+,r);
MUL(h,f,lenl-,g+lenl+,lenr);
MUL(f,f+lenl+,lenr-,g,lenl);
for(int i=;i<=r-l+;i++) f[i]=(f[i]+h[i])%MOD;
MUL(g,g,lenl,g+lenl+,lenr);
} int ff[M]={},gg[M]={};
int main(){
fac[]=; for(int i=;i<M;i++) fac[i]=fac[i-]*i%MOD;
int n; scanf("%d",&n);
for(int i=;i<=n;i++){
L P,B,A; scanf("%lld%lld%lld",&P,&A,&B);
D[i]=(P+B-P*B%MOD+MOD)%MOD;
E[i]=A*P%MOD;
}
solve(ff,gg,,n);
L ans=;
for(int i=;i<n;i++) (ans+=1LL*ff[i]*fac[i]%MOD*fac[n-i-])%=MOD;
ans=ans*pow_mod(fac[n],MOD-)%MOD;
cout<<ans<<endl;
}

【2019北京集训测试赛(七)】 操作 分治+FFT+生成函数的更多相关文章

  1. 【2019北京集训测试赛(十三)】数据(sj) 冷静分析

    题目大意:给你一个代表区间$[1,n]$的线段树,问你随机访问区间$[1,n]$中的一个子区间,覆盖到的线段树节点个数的期望(需要乘上$\frac{n(n-1)}{2}$后输出). 数据范围:$n≤1 ...

  2. [2016北京集训测试赛5]小Q与内存-[线段树的神秘操作]

    Description Solution 哇真的异常服气..线段树都可以搞合并和拆分的啊orzorz.神的世界我不懂 Code #include<iostream> #include< ...

  3. 2016北京集训测试赛(七)Problem A: 自动机

    Solution 注意到这一题并不要求字符串最短或者是字典序最小, 因此直接构造就可以了. 我们对于每个点\(u \ne 0\)找到一个串\(S\), 使得\(T(u, S) = T(0, S)\), ...

  4. [2016北京集训测试赛7]isn-[树状数组+dp+容斥]

    Description Solution 定义dp[i][j]为在1到i个数中选了j个数,并且保证选了i的选法总数. dp[i][j]为所有满足A[k]>A[i]的k(k<i)的dp[k] ...

  5. 2016北京集训测试赛(十七)Problem B: 银河战舰

    Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...

  6. BZOJ 4543 2016北京集训测试赛(二)Problem B: thr 既 长链剖分学习笔记

    Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...

  7. BZOJ 4543 2016北京集训测试赛(二)Problem B: thr

    Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...

  8. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

  9. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

随机推荐

  1. linux nginx 基本用法

    nginx -s reload -p <nginx环境目录> -c <指定的配置文件> 其中-p -c 为可选,不写为默认路径和配置 在执行命令之前可通过 nginx -t - ...

  2. nginx_server_location对客户资源的辨别规则

    语法:location [ = | ~ | ~* | ^~ ] uri { …一组命令… } http://nginx.org/en/docs/http/ngx_http_core_module.ht ...

  3. python爬虫小说代码,可用的

    python爬虫小说代码,可用的,以笔趣阁为例子,python3.6以上,可用 作者的QQ:342290433,汉唐自远工程师 import requests import refrom lxml i ...

  4. 解决find命令报错: paths must precede expression

    eg: find . -name *.c -or -name *.cpp 需要将模糊搜索词用引号括起来: find . -name "*.c" -or -name "*. ...

  5. 20175314 实验一 Java开发环境的熟悉

    20175314 实验一 Java开发环境的熟悉 一.实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA 编辑.编译.运行.调试Java程序. 3.完成实验,撰写实验报告,注意实 ...

  6. 音频音乐播放 Service

    界面效果:         界面就一个播放的Button和一个进度条SeekBar,也可以自己加上两个显示时间的TextView: 点击播放时,有音乐声音,进度条也会自动更新,Button文字变成暂停 ...

  7. maven 监理web war 项目

  8. github管理项目

    1.在GitHub上创建一个项目,然后拷贝git地址. 2.在本地打开GIT CMD,然后建立一个文件夹,输入git clone 上面拷贝的git地址. 3.文件夹下会多出一个以你创建的项目名字的文件 ...

  9. 分布式协议学习笔记(一) Raft 选举

    Raft官网 官方可视化动画1 官方可视化动画2 论文中文翻译 论文英文地址 感觉作为paxos的升级精简版 Raft在设计之初就以容易理解为目标 看完资料 脑海里都有了大概的轮廓. 有了这些详细的资 ...

  10. URI编码时遇到特殊字符的处理方式

    今天遇到一个问题,在向一个地址发起get请求时,某个参数是这种形式:foo=xx&&yyyy,其中"&&"是参数值的一部分,在调用这个接口时,后台收 ...