题意:一个血量为$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]暴风士兵的更多相关文章

  1. [Unity3d]3D项目转换为VR项目(暴风魔镜SDK)

    使用暴风魔镜SDK来操作 将魔镜的摄像头拖放到项目中: 将MoJingVrHead的Script剪切到CamRoot中: 这个时候能看到显示2个物体了,不过使用的Canvas还是显示一个: 调整Can ...

  2. VR的世界里没有雾霾!暴风魔镜发布Matrix一体机

         在2016年接近尾声的时候,暴风魔镜给VR行业带来一波暖流.12月20日,暴风魔镜宣布推出最新VR一体机--暴风魔镜"3K屏概念机"MATrix及VR眼镜S1两大产品. ...

  3. Java-马士兵动态代理模式

    Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...

  4. 马士兵Java视频教程 —— 学习顺序

    第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JAVA视频教程_JDK5.0_下载-安装-配置 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第01章_JAVA简介_源代码_及重 ...

  5. 暴风冯鑫:去美国香港的99%都亏,互联网公司打死都要回A股

        “上市之后,我回答得最多的两句话:一句是运气好:另一句是有好运气要好好地使用它.” 5月18日,暴风科技上市55天后,首享科技大厦办公室里,暴风科技CEO冯鑫这样对我说. 在经历了36个涨停之 ...

  6. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 782  Solved: 456[Submit][Status][Discuss] ...

  7. 洛谷P1889 士兵站队

    题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...

  8. nyoj123_士兵杀敌(四)_树状数组_插线求点

    士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...

  9. 士兵杀敌(三)_RMQ(区间最值查询)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

随机推荐

  1. [2009国家集训队]小Z的袜子(hose)(BZOJ2038+莫队入门题)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目: 题意:中文题意,大家都懂. 思路:莫队入门题.不过由于要去概率,所以我们假 ...

  2. 如何创建和销毁对象(Effective Java 第二章)

    最近有在看Effective Java,特此记录下自己所体会到的东西,写篇博文会更加的加深印象,如有理解有误的地方,希望不吝赐教. 这章主题主要是介绍:何时以及如何创建对象,何时以及如何避免创建对象, ...

  3. Spring cloud 实战读书笔记

    基础知识 Spring cloud 版本说明 Brixton.SR5 :Brixton 的第5个Release版本 SRX:service releases 简称SRX版本,X版本号 Spring b ...

  4. perl6 修改文件并覆盖

    use v6; my $filename = 'data.txt'; my $data = slurp $filename; say $data; $data ~~ s/'4'/'ABC'/; say ...

  5. Django【设计】可插拔的插件方式实现

    需求: 在CMDB系统中,我们需要对资产进行采集和资产入库,包括serverBasic.disk.memory.nic信息等,客户端需要采集这些硬件的信息,服务端则负责资产入库,但是需要采集的硬件并不 ...

  6. 斯坦福开源无Bug的随机计算图Certigrad

    斯坦福开源无Bug的随机计算图Certigrad https://news.cnblogs.com/n/573690/ ttps://github.com/dselsam/certigrad

  7. 判断cookie创建的时间是否已经24小时

    def read_cookie(self): cookiesfilepath="cookies%s" % self.uid if os.path.exists(cookiesfil ...

  8. Bzoj-2301 [HAOI2011]Problem b 容斥原理,Mobius反演,分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:多次询问,求有多少对数满足 gcd(x,y)=k, a<=x<=b ...

  9. [New learn]AutoLayout调查基于code

    代码https://github.com/xufeng79x/TestAutolayout-code2 0.插在前面 必须关闭view的自动缩放掩码,自动缩放掩码是autolayout出现之前系统管理 ...

  10. windows系统安装mysql压缩zip版

    1.下载 打开官网:https://www.mysql.com 进入DOWNLOADS--->Community--->MySQL Community Server,选择系统对应的版本点击 ...