【PKUWC2018】猎人杀
题目描述


题目分析
设\(W=\sum\limits_{i=1}^nw_i\),\(A=\sum\limits_{i=1}^nw_i[i\ is\ alive]\),\(P_i\)为下一个打中\(i\)的概率。
如果开枪打中了已经死亡的猎人,我们可以视作再开一枪,这样就不会产生影响,因此有
P_i&=\frac{W-A}{W}P_i+\frac{w_i}W\\
移项得\ P_i&=\frac{w_i}{A}
\end{split}
\]
考虑容斥,枚举\(S\),强制\(|S|\)个人在\(1\)后被射杀,其他随意,
所以可以视作打中其他人与打中死亡的猎人等价,可以再开一枪,
因此,\(1\)号猎人在其他\(|S|\)个猎人前被射杀的概率为\(P_1\)
ans&=\sum_S(-1)^{|S|}P_1\\
&=\sum_{S}(-1)^{|S|}\frac{w_1}{w_1+sum\_w_S}\\
&=w_1\sum_{S}(-1)^{|S|}\frac{1}{w_1+sum\_w_S}
\end{split}
\]
考虑生成函数,后面的和式等价于
\]
用分治+NTT求出,第\(i\)项的指数为\(sum\_w_S\),系数为满足这个\(sum\)的容斥系数和。
若生成函数为\(\sum\limits_{i=0}^\infty a_ix^i\),则
\]
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=400005,mod=998244353;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int ksm(int x,int k){
int ret=1;
while(k){
if(k&1)ret=(LL)ret*x%mod;
x=(LL)x*x%mod,k>>=1;
}
return ret;
}
int rev[N];
void NTT(int *a,int x,int K){
int n=(1<<x);
for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=1;i<n;i<<=1){
int tmp=i<<1,wn=ksm(3,(mod-1)/tmp);
if(K==-1)wn=ksm(wn,mod-2);
for(int j=0;j<n;j+=tmp){
int w=1;
for(int k=0;k<i;k++,w=(LL)w*wn%mod){
int x=a[j+k],y=(LL)w*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
}
}
}
if(K==-1){
int inv=ksm(n,mod-2);
for(int i=0;i<n;i++)a[i]=(LL)a[i]*inv%mod;
}
}
int w[N],sum[N];
void Binary(int *a,int l,int r){
if(l==r)return a[0]=1,a[w[l]]=mod-1,void();
int mid=l+r>>1;
int f[N],g[N];
memset(f,0,(sum[r]-sum[l-1]+1)<<3),memset(g,0,(sum[r]-sum[l-1]+1)<<3);
Binary(f,l,mid),Binary(g,mid+1,r);
int x=ceil(log2(sum[r]-sum[l-1]+2));
for(int i=0;i<(1<<x);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1);
NTT(f,x,1),NTT(g,x,1);
for(int i=0;i<(1<<x);i++)a[i]=(LL)f[i]*g[i]%mod;
NTT(a,x,-1);
}
int a[N];
int main(){
int n=Getint(),t=Getint();
if(n==1)cout<<1,exit(0);n--;
for(int i=1;i<=n;i++)w[i]=Getint(),sum[i]=sum[i-1]+w[i];
Binary(a,1,n);
int ans=0;
for(int i=0;i<=sum[n];i++)
ans=(ans+(LL)a[i]*t%mod*ksm(t+i,mod-2)%mod)%mod;
cout<<ans;
return 0;
}
【PKUWC2018】猎人杀的更多相关文章
- LOJ2541 PKUWC2018 猎人杀 期望、容斥、生成函数、分治
传送门 首先,每一次有一个猎人死亡之后\(\sum w\)会变化,计算起来很麻烦,所以考虑在某一个猎人死亡之后给其打上标记,仍然计算他的\(w\),只是如果打中了一个打上了标记的人就重新选择.这样对应 ...
- LOJ2541 PKUWC2018猎人杀(概率期望+容斥原理+生成函数+分治NTT)
考虑容斥,枚举一个子集S在1号猎人之后死.显然这个概率是w1/(Σwi+w1) (i∈S).于是我们统计出各种子集和的系数即可,造出一堆形如(-xwi+1)的生成函数,分治NTT卷起来就可以了. #i ...
- [PKUWC2018]猎人杀
题解 感觉是一道神题,想不出来 问最后\(1\)号猎人存活的概率 发现根本没法记录状态 每次转移的分母也都不一样 可以考虑这样一件事情: 如果一个人被打中了 那么不急于从所有人中将ta删除,而是给ta ...
- 洛谷 P5644 - [PKUWC2018]猎人杀(分治+NTT)
题面传送门 很久之前(2020 年)就听说过这题了,这么经典的题怎么能只听说而亲自做一遍呢 首先注意到每次开枪打死一个猎人之后,打死其他猎人概率的分母就会发生变化,这将使我们维护起来非常棘手,因此我们 ...
- [LOJ2541][PKUWC2018]猎人杀(容斥+分治+FFT)
https://blog.csdn.net/Maxwei_wzj/article/details/80714129 n个二项式相乘可以用分治+FFT的方法,使用空间回收可以只开log个数组. #inc ...
- 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...
- [LOJ2541] [PKUWC2018] 猎人杀
题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...
- 题解-PKUWC2018 猎人杀
Problem loj2541 题意概要:给定 \(n\) 个人的倒霉度 \(\{w_i\}\),每回合会有一个人死亡,每个人这回合死亡的概率为 自己的倒霉度/目前所有存活玩家的倒霉度之和,求第 \( ...
- 「PKUWC2018」猎人杀
「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...
- 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)
[LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...
随机推荐
- javafx实现读者文摘上的文章预览及下载
功能设计: 1.实现读者文章的预览及下载 (实现了单击预览,双击下载) 2.实现文章查找 (实现了通过文章名查找(关键字)或者文章期数或年份(或者年份加期数)) 实现步骤: 首先是数据库设计: 数据库 ...
- maven环境变量配置及测试
首先要确认,你是否已经安装了jdk,并且已经成功配置了环境变量. 和java配置类似,计算机右键属性->高级系统设置->环境变量. 添加如下变量: 变量名:maven_home 变量值:C ...
- 让所有Excel数据格全部乘 某个数
1 首先设置单元格格式要是数字 2 然后在随便一个单元格写入你要乘的数字 3 粘贴的时候设置选择性粘贴,然后设置乘就OK
- linux系统物理cpu信息查询
1.查看CPU型号 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 2.查看物理CPU的个数 ca ...
- laravel将数组转换成集合
$myArray = collect($this -> menuPermissionTypes); //$this -> menuPermissionTypes是数组! dd($myArr ...
- 用记事本和Eclipse编写Java程序
JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一 ...
- Confluence 6 站点备份和恢复
Atlassian 推荐针对生产环境中安装使用的 Confluence 使用原始数据库工具备份策略. 在默认的情况下,Confluence 每天都会备份所有数据和附件到 XML 文件备份中.这些文件被 ...
- jmeter登录之-动态参数
jmeter登录之-动态参数 1.抓包查看提交的登录参数 发现参数authenticity_token是动态的,每次都不一样,所以回放的时候就会失败 2.提取动态变化的参数-后置处理器(相当于LR的关 ...
- [NOIP模拟测试11] 题解
A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...
- 一:unittest框架配合selenium工具之CSS_selector定位。
做了自动化测试这么久了,一直没有梳理到元素定位这一块的内容,其重要性不言而喻.趁着周末有时间,梳理一下. 1,通过id定位 driver.find_element_by_css_selector(&q ...