题意:一个血量为$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. 表格td内容超出宽度显示... table-layout: fixed;

    td宽度用百分比固定好的时候,即使设置了 white-space:nowrap;/*文本不会换行,在同一行显示*/ overflow:hidden;超出隐藏 text-overflow:ellipsi ...

  2. Angular2.0 基础: 环境搭建

    最近在学习Angular2的使用,其实看过Angular2 文档的都知道,相比于之前的Angular1,Angular2 的改动还是挺大的. 而对于‘angular2 的本地开发环境的搭建的中,我们首 ...

  3. python产生随机样本数据

    一.产生X样本 x_train = np.random.random((5, 3)) 随机产生一个5行3列的样本矩阵,也就是5个维度为3的训练样本. array([[ 0.56644011, 0.75 ...

  4. linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法

    linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法 http://blog.csdn.net/w616589292/article/details/38274475 dos2unix ...

  5. python爬虫实战——5分钟做个图片自动下载器

      python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...

  6. C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?

    转自[http://blog.csdn.net/bodybo/article/details/43191319] 程序需要读取Exel文件,有如下代码段 object oMissing = Syste ...

  7. cacti (不可以利用yum安装cacti的配置)

    我们如果用yum不可以安装cacti,我们则可以利用tar包来安装!!! //cacti的配置准备 [root@localhost ~]# yum install -y epel-release [r ...

  8. 修改centos地址连接为自动连接

    1.进入目录/etc/sysconfig/network-scripts/ 2.修改ifcfg-etn0 文件   (即你的网卡标识命名的配置文件) 3.将ONBOOT=no改成yes 4.保存后重启 ...

  9. FineReport——决策系统组件API

    FineReport数据决策系统中自定义主题包API接口由5大部件组成:框架布局.目录树组件.多tab组件.Navigation组件和Gallery组件. 首先,对theme.js进行总体配置: (f ...

  10. 关于JqueryEasyUI插件—Tab,默认选中某个面板 如果不明显指定的话,第一个就是被选中的

    如果不明显指定的话,第一个就是被选中的,你可以通过data-options="selected:true"指定默认选中