[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,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...
随机推荐
- 【洛谷 P3187】 [HNOI2007]最小矩形覆盖 (二维凸包,旋转卡壳)
题目链接 嗯,毒瘤题. 首先有一个结论,就是最小矩形一定有条边和凸包重合.脑补一下就好了. 然后枚举凸包的边,用旋转卡壳维护上顶点.左端点.右端点就好了. 上顶点用叉积,叉积越大三角形面积越大,对应的 ...
- POJ 2991 Crane (线段树)
题目链接 Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of v ...
- ES6数组去重及ES5数组去重方法
ES6中新增了Set数据结构,类似于数组,但是 它的成员都是唯一的 ,其构造函数可以接受一个数组作为参数,如: let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3]; ...
- C#编写程序监测某个文件夹内是否有文件进行了增,删,改的动作?
新建一个Console应用程序,项目名称为“FileSystemWatcher”,Copy代码进,编译后就可以用了.代码如下: using System; using System.Collectio ...
- Spring Boot:定制自己的starter
在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...
- 自动化测试===Macaca环境搭建和说明书
https://www.cnblogs.com/tim2016/p/6400326.html http://www.cnblogs.com/fnng/p/5873878.html https://ww ...
- 【POJ3254】coinfield
状压dp初步. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...
- 【模板】解决二分图匹配的强力算法——Hopcroft-Karp算法
详细解释 参见:http://blog.csdn.net/wall_f/article/details/8248373 简要过程 HK算法可以当成是匈牙利算法的优化版,和dinic算法的思想比较类似. ...
- Python——format()/str.format()函数
格式化输出,除了类似于C语言的格式化输出外,还有str.format()方法,Python内建的format()函数,允许用户将待输出值以参数的形式,调用format()函数,在Python交互式sh ...
- vue 文件引入
直接 <script> 引入 直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量.重要提示:在开发时请用开发版本,遇到常见错误它会给出友好的警告. 开发环 ...