[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,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...
随机推荐
- JS 本地属性与继承属性
判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...
- fragment+tabhost与viewpager
学到哪里写到哪里吧 A.viewpager a.用V4包中的fragment,activity继承FragmentActivity b.布局中加入<android.support.v4.view ...
- idea 调试远程tomcat
# ----- Execute The Requested Command ----------------------------------------- JAVA_OPTS="-age ...
- linux 设备树【转】
转自:http://blog.csdn.net/chenqianleo/article/details/77779439 [-] linux 设备树 为什么要使用设备树Device Tree 设备树的 ...
- 1000: 恶意IP 课程作业
1000: 恶意IP Time Limit: 1 Sec Memory Limit: 16 MB Description Water同学最近好不容易学会了用Tornado建起一个个人的Website ...
- Linq to SQL 小结
前天开始看这方面的资料,虽然看了网上对比 sql和linq的速度,万条数据可能要慢1/4左右的数度,但是介于的方便,还是学了 首先看看linq的基本语法: FROM XX IN DATASOURCE ...
- 1.Python3标准库--前戏
Python有一个很大的优势便是在于其拥有丰富的第三方库,可以解决很多很多问题.其实Python的标准库也是非常丰富的,今后我将介绍一下Python的标准库. 这个教程使用的书籍就叫做<Pyth ...
- NOI openjudge 1792.迷宫
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某个格点时,他只 ...
- sharding-jdbc 实现分表
Sharding-JDBC 简介 Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本: 可适用于任何基于Java的ORM框架,如:JPA.HIberna ...
- java 内部类和静态内部类的区别
private class InnerClass { // 只有在静态内部类中才能够声明或定义静态成员 // private static String tt = &quo ...