题目描述

题目分析

设\(W=\sum\limits_{i=1}^nw_i\),\(A=\sum\limits_{i=1}^nw_i[i\ is\ alive]\),\(P_i\)为下一个打中\(i\)的概率。

如果开枪打中了已经死亡的猎人,我们可以视作再开一枪,这样就不会产生影响,因此有

\[\begin{split}
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\)

\[\begin{split}
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}
\]

考虑生成函数,后面的和式等价于

\[\sum_{i=2}^n(1-x^{w_i})
\]

用分治+NTT求出,第\(i\)项的指数为\(sum\_w_S\),系数为满足这个\(sum\)的容斥系数和。

若生成函数为\(\sum\limits_{i=0}^\infty a_ix^i\),则

\[ans=\sum_{i=0}^\infty a_i\cdot \frac{w_1}{w_1+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】猎人杀的更多相关文章

  1. LOJ2541 PKUWC2018 猎人杀 期望、容斥、生成函数、分治

    传送门 首先,每一次有一个猎人死亡之后\(\sum w\)会变化,计算起来很麻烦,所以考虑在某一个猎人死亡之后给其打上标记,仍然计算他的\(w\),只是如果打中了一个打上了标记的人就重新选择.这样对应 ...

  2. LOJ2541 PKUWC2018猎人杀(概率期望+容斥原理+生成函数+分治NTT)

    考虑容斥,枚举一个子集S在1号猎人之后死.显然这个概率是w1/(Σwi+w1) (i∈S).于是我们统计出各种子集和的系数即可,造出一堆形如(-xwi+1)的生成函数,分治NTT卷起来就可以了. #i ...

  3. [PKUWC2018]猎人杀

    题解 感觉是一道神题,想不出来 问最后\(1\)号猎人存活的概率 发现根本没法记录状态 每次转移的分母也都不一样 可以考虑这样一件事情: 如果一个人被打中了 那么不急于从所有人中将ta删除,而是给ta ...

  4. 洛谷 P5644 - [PKUWC2018]猎人杀(分治+NTT)

    题面传送门 很久之前(2020 年)就听说过这题了,这么经典的题怎么能只听说而亲自做一遍呢 首先注意到每次开枪打死一个猎人之后,打死其他猎人概率的分母就会发生变化,这将使我们维护起来非常棘手,因此我们 ...

  5. [LOJ2541][PKUWC2018]猎人杀(容斥+分治+FFT)

    https://blog.csdn.net/Maxwei_wzj/article/details/80714129 n个二项式相乘可以用分治+FFT的方法,使用空间回收可以只开log个数组. #inc ...

  6. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)

    点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...

  7. [LOJ2541] [PKUWC2018] 猎人杀

    题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...

  8. 题解-PKUWC2018 猎人杀

    Problem loj2541 题意概要:给定 \(n\) 个人的倒霉度 \(\{w_i\}\),每回合会有一个人死亡,每个人这回合死亡的概率为 自己的倒霉度/目前所有存活玩家的倒霉度之和,求第 \( ...

  9. 「PKUWC2018」猎人杀

    「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...

  10. 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)

    [LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...

随机推荐

  1. Activity向Fragment传值

    发送数据 //Activity传值,通过Bundle Bundle bundle = new Bundle(); bundle.putString("MainActivity", ...

  2. Install ncurses (ncurses-devel) and try again

    apt install libncurses5-dev libncursesw5-dev

  3. 前端学习(二)css样式笔记(笔记)

    background-image:url(img/xiaofeiji.jpg)背景图:url(图片路径):(背景图默认平铺) background-repeat:repeat-x/repeat-y/n ...

  4. vue 条件渲染v-if v-show

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Java中的Set集合以及HashSet

    Set集合: Set继承自Collection,所以没有什么特别的方法. 需要注意的是,Set集合不包含重复元素,我们重点了解Set集合如何保证不包含多余元素. HashSet: HashSet如何保 ...

  6. 基于.Net4.0实现 ToastNotification

    基于.Net4.0实现 ToastNotification Windows更新之路的特色之一就是消息提示由气泡变成了通知窗口,效果简直不要太好.最近公司有这方面的需求,需要在xp,win7系统上给出提 ...

  7. React中Class的概念

    Class的概念 一.简介 javaScript是面向对象的编程语言,可以说所以的能够被描述的事.物或抽象的东西,都是可以是对象.而我们记录的对象,会有具有同样的属性和行为. 为了节省重写相同的代码. ...

  8. NOIP模拟测试17

    T1:入阵曲 题目大意:给定一个N*M的矩形,问一共有多少个子矩形,使得矩形内所有书的和为k的倍数. 60%:N,M<=80 枚举矩形的左上角和右下角,用二维前缀和求出数字之和. 时间复杂度$O ...

  9. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

  10. python_way day15 HTML-DAY2、 回顾HTML-CSS 标签(css强制生效),JS(数据类型,时间处理,作用域)

    python_way day15 HTML-DAY2 html-css回顾 javascript 一.html-css回顾 增加默认值: . 强制生效,就算在上面,被覆盖上了也会生效 解决缩小页面混乱 ...