[xsy3241]暴风士兵
题意:一个血量为$h$的人,它会被攻击$n$次,第$i$次有$p$的概率$-1$滴血(每次的$p$不同),问每次攻击后他的血量期望,强制在线
若一个人被扣了$i$滴血的概率为$p_i$,那么记多项式$P(x)=\sum\limits_ip_ix^i$,一次概率为$p$的攻击相当于将它乘上$px+1-p$,询问就相当于求$\sum\limits_ip_ic_i$,其中$c_i=[i\lt h](h-i)$
我们要对每个$px+1-p$的前缀积$A(x)$求$\sum\limits_ic_i[x^i]A(x)$,但肯定不能直接求
考虑对于$i$的答案,如果我们只求$k\cdots i$的积,前面忽略掉的$1\cdots k-1$会对答案造成什么影响
设$A(x)$为$1\cdots k-1$的积,$B(x)$为$k\cdots i$的积,我们想要求$c'$使得$\sum\limits_ic_i[x^i]A(x)B(x)=\sum\limits_ic_i'[x^i]B(x)$,推一下可得$c_i'=\sum\limits_{j\geq i}c_ja_{j-i}$
到这里就好办了,我们可以分治算答案,算到$[l,r]$时先递归算$[l,mid]$,做卷积算对应于$[mid+1,r]$的$c'$,然后再递归算$[mid+1,r]$
然后你发现这个强制在线好像没有用,因为我们使用$p$是按顺序来的...时间复杂度$O(n\log^2n)$,空间复杂度$O(n\log n)$
#include<stdio.h&>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=998244353;
int mul(int a,int b){return(ll)a*b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
int pow(int a,int b){
int s=1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
int rev[262144],N,iN;
void pre(int n){
int i,k=0;
for(N=1,k=0;N<=n;N<<=1)k++;
for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
iN=pow(N,mod-2);
}
void ntt(int*a,int on){
int i,j,k,t,w,wn;
for(i=0;i<N;i++){
if(i<rev[i])swap(a[i],a[rev[i]]);
}
for(i=2;i<=N;i<<=1){
wn=pow(3,on==1?(mod-1)/i:mod-1-(mod-1)/i);
for(j=0;j<N;j+=i){
w=1;
for(k=0;k<i>>1;k++){
t=mul(a[i/2+j+k],w);
a[i/2+j+k]=de(a[j+k],t);
a[j+k]=ad(a[j+k],t);
w=mul(w,wn);
}
}
}
if(on==-1){
for(i=0;i<N;i++)a[i]=mul(a[i],iN);
}
}
int ta[262144],tb[262144];
int c[100010],ans;
int*solve(int l,int r){
int*res=new int[r-l+2],*tl,*tr,*tc,mid,ln,rn,i;
if(l==r){
int p;
scanf("%d",&p);
p+=ans;
res[0]=1-p;
res[1]=p;
ans=(((ll)p*c[1]+(ll)(1-p)*c[0])%mod+mod)%mod;
printf("%d\n",ans);
return res;
}
mid=(l+r)>>1;
ln=mid-l+1;
rn=r-mid;
tc=new int[r-l+2];
memcpy(tc,c,(r-l+2)<<2);
tl=solve(l,mid);
pre((r-l+1)<<1);
memset(ta,0,N<<2);
memset(tb,0,N<<2);
for(i=0;i<=r-l+1;i++){
ta[r-l+1-i]=c[i];
tb[i]=(i<=ln?tl[i]:0);
}
ntt(ta,1);
ntt(tb,1);
for(i=0;i<N;i++)ta[i]=mul(ta[i],tb[i]);
ntt(ta,-1);
for(i=0;i<=rn;i++)c[i]=ta[r-l+1-i];
tr=solve(mid+1,r);
pre(r-l+1);
memset(ta,0,N<<2);
memcpy(ta,tl,(ln+1)<<2);
memset(tb,0,N<<2);
memcpy(tb,tr,(rn+1)<<2);
ntt(ta,1);
ntt(tb,1);
for(i=0;i<N;i++)ta[i]=mul(ta[i],tb[i]);
ntt(ta,-1);
memcpy(res,ta,(r-l+2)<<2);
memcpy(c,tc,(r-l+2)<<2);
return res;
}
int main(){
int n,i;
scanf("%d%d",&ans,&n);
for(i=0;i<=ans;i++)c[i]=ans-i;
solve(1,n);
}
[xsy3241]暴风士兵的更多相关文章
- [Unity3d]3D项目转换为VR项目(暴风魔镜SDK)
使用暴风魔镜SDK来操作 将魔镜的摄像头拖放到项目中: 将MoJingVrHead的Script剪切到CamRoot中: 这个时候能看到显示2个物体了,不过使用的Canvas还是显示一个: 调整Can ...
- VR的世界里没有雾霾!暴风魔镜发布Matrix一体机
在2016年接近尾声的时候,暴风魔镜给VR行业带来一波暖流.12月20日,暴风魔镜宣布推出最新VR一体机--暴风魔镜"3K屏概念机"MATrix及VR眼镜S1两大产品. ...
- Java-马士兵动态代理模式
Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
- 马士兵Java视频教程 —— 学习顺序
第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JAVA视频教程_JDK5.0_下载-安装-配置 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第01章_JAVA简介_源代码_及重 ...
- 暴风冯鑫:去美国香港的99%都亏,互联网公司打死都要回A股
“上市之后,我回答得最多的两句话:一句是运气好:另一句是有好运气要好好地使用它.” 5月18日,暴风科技上市55天后,首享科技大厦办公室里,暴风科技CEO冯鑫这样对我说. 在经历了36个涨停之 ...
- 【BZOJ-1458】士兵占领 最大流
1458: 士兵占领 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 782 Solved: 456[Submit][Status][Discuss] ...
- 洛谷P1889 士兵站队
题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...
- nyoj123_士兵杀敌(四)_树状数组_插线求点
士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...
- 士兵杀敌(三)_RMQ(区间最值查询)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...
随机推荐
- Python3 嵌套函数
嵌套函数: 函数体内用def定义函数 注意:函数体中调用其他函数不算嵌套函数,只能是函数的调用 简单的嵌套函数: 输出结果:
- java===java基础学习(9)---方法参数
方法参数注意三要点: 一个方法不能修改一个基本数据类型的参数(数值型或者布尔型). 一个方法可以改变一个对象参数的状态. 一个方法不能让对象参数引用一个新的对象. package testbotoo; ...
- Deep Learning基础--26种神经网络激活函数可视化
在神经网络中,激活函数决定来自给定输入集的节点的输出,其中非线性激活函数允许网络复制复杂的非线性行为.正如绝大多数神经网络借助某种形式的梯度下降进行优化,激活函数需要是可微分(或者至少是几乎完全可微分 ...
- android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库
我们的程序在32位机器上没有问题,有一天公司采购了一台魅族MX5 MTK的64位处理器上我们的应用报错了 "nativeLibraryDirectories=[/data/app/com.l ...
- [How to]基于本地镜像的yum镜像源搭建
1.简介 本文介绍如何在封闭环境(无外网)下安装离线安装本地镜像与基于本地镜像的yum镜像源. 2.环境版本交代: OS:CentOS-6.7-x86_64-minimal yum: yum-3.2. ...
- printf格式化输出
基本格式 printf [format] [文本1] [文本2] .. 常用格式替换符 %s 字符串 %f 浮点格式 %c ASCII字符,即显示对应参数的第一个字符 %d,%i 十进制整数 %o 八 ...
- linux和性能相关的命令及系统性能诊断
常用的和性能有关的命令 Iostat/vmstat/top/mpstat/time/strace/ipcs/ipcrm/ifconfig/tethereal/netstat/free/uptime 关 ...
- elasticsearch使用Analyze API
curl -XGET 'localhost:9200/index_name/_analyze?pretty&field=type_name.field_name' -d 'Robots car ...
- [转载]NGINX原理分析 之 SLAB分配机制
作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.09.15 23:19 转载请注明来自&q ...
- hdu 2768(建图,最大点独立集)
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...