LOJ2541 PKUWC2018猎人杀(概率期望+容斥原理+生成函数+分治NTT)
考虑容斥,枚举一个子集S在1号猎人之后死。显然这个概率是w1/(Σwi+w1) (i∈S)。于是我们统计出各种子集和的系数即可,造出一堆形如(-xwi+1)的生成函数,分治NTT卷起来就可以了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],s[N],r[N*],inv[N*],f[N*],t,ans;
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
void DFT(int *a,int n,int g)
{
for (int i=;i<n;i++) r[i]=(r[i>>]>>)|(i&)*(n>>);
for (int i=;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);
for (int i=;i<=n;i<<=)
{
int wn=ksm(g,(P-)/i);
for (int j=;j<n;j+=i)
{
int w=;
for (int k=j;k<j+(i>>);k++,w=1ll*w*wn%P)
{
int x=a[k],y=1ll*w*a[k+(i>>)]%P;
a[k]=(x+y)%P,a[k+(i>>)]=(x-y+P)%P;
}
}
}
}
void mul(int *a,int *b,int n)
{
DFT(a,n,),DFT(b,n,);
for (int i=;i<n;i++) a[i]=1ll*a[i]*b[i]%P;
DFT(a,n,inv[]);
for (int i=;i<n;i++) a[i]=1ll*a[i]*inv[n]%P;
}
void solve(int l,int r,int *f,int n)
{
if (l==r) {f[]=,f[a[l]]=P-;return;}
int a[n]={},mid=l;
for (int i=l;i<=r;i++) if (s[i]-s[l-]>s[r]-s[i]) {mid=i;break;}
if (mid==r) mid--;
int t1=;while (t1<=(s[mid]-s[l-]<<)) t1<<=;
solve(l,mid,f,t1);
t1=;while (t1<=(s[r]-s[mid]<<)) t1<<=;
solve(mid+,r,a,t1);
mul(f,a,n);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("loj2541.in","r",stdin);
freopen("loj2541.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) s[i]=s[i-]+(a[i]=read());
t=;while (t<=(s[n]<<)) t<<=;
inv[]=;for (int i=;i<N*;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
solve(,n,f,t);
for (int i=;i<=s[n];i++)
ans=(ans+1ll*a[]*inv[i+a[]]%P*f[i])%P;
cout<<ans;
return ;
}
LOJ2541 PKUWC2018猎人杀(概率期望+容斥原理+生成函数+分治NTT)的更多相关文章
- 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...
- LOJ2541 PKUWC2018 猎人杀 期望、容斥、生成函数、分治
传送门 首先,每一次有一个猎人死亡之后\(\sum w\)会变化,计算起来很麻烦,所以考虑在某一个猎人死亡之后给其打上标记,仍然计算他的\(w\),只是如果打中了一个打上了标记的人就重新选择.这样对应 ...
- [LOJ2541] [PKUWC2018] 猎人杀
题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...
- [LOJ2541][PKUWC2018]猎人杀(容斥+分治+FFT)
https://blog.csdn.net/Maxwei_wzj/article/details/80714129 n个二项式相乘可以用分治+FFT的方法,使用空间回收可以只开log个数组. #inc ...
- LOJ2541. 「PKUWC2018」猎人杀 [概率,分治NTT]
传送门 思路 好一个神仙题qwq 首先,发现由于一个人死之后分母会变,非常麻烦,考虑用某种方法定住分母. 我们稍微改一改游戏规则:一个人被打死时只打个标记,并不移走,也就是说可以被打多次但只算一次.容 ...
- [PKUWC2018]猎人杀
题解 感觉是一道神题,想不出来 问最后\(1\)号猎人存活的概率 发现根本没法记录状态 每次转移的分母也都不一样 可以考虑这样一件事情: 如果一个人被打中了 那么不急于从所有人中将ta删除,而是给ta ...
- 题解-PKUWC2018 猎人杀
Problem loj2541 题意概要:给定 \(n\) 个人的倒霉度 \(\{w_i\}\),每回合会有一个人死亡,每个人这回合死亡的概率为 自己的倒霉度/目前所有存活玩家的倒霉度之和,求第 \( ...
- 洛谷 P5644 - [PKUWC2018]猎人杀(分治+NTT)
题面传送门 很久之前(2020 年)就听说过这题了,这么经典的题怎么能只听说而亲自做一遍呢 首先注意到每次开枪打死一个猎人之后,打死其他猎人概率的分母就会发生变化,这将使我们维护起来非常棘手,因此我们 ...
- LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)
如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...
随机推荐
- kettle学习笔记(七)——kettle流程步骤与应用步骤
一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...
- redis系列--深入哨兵集群
一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...
- [Oracle]坏块处理:确认坏块的对象
如果已经知道 FILE#,BLOCK#,则 可以通过如下查询来看: SQL> SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME FROM DBA_EXTE ...
- python 翻转棋(othello)
利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间. 几点改进说明: 拆分成四个文件:board.py,player.py,ai.py,othello.py.使得整个结 ...
- ElasticSearch查询 第三篇:词条查询
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- ANSYS渡槽槽身动水压力的施加(1)——矩形渡槽
前言 依据水工抗震规范中关于渡槽动水压力的部分编一个用于ANSYS渡槽模型动水压力施加的命令流,是我研究生时一直想要做的一件事,原因嘛主要是想对比一下规范提供的方法和ANSYS声学流体单元模拟水体这两 ...
- 推荐一个MacOS苹果电脑系统解压缩软件
废话少说,直入主题: 连接:https://www.keka.io/en/ 开源免费好用(个人觉得比betterzip好用哈),附一张这货的图标:
- 简单的RNN和BP多层网络之间的区别
先来个简单的多层网络 RNN的原理和出现的原因,解决什么场景的什么问题 关于RNN出现的原因,RNN详细的原理,已经有很多博文讲解的非常棒了. 如下: http://ai.51cto.com/art/ ...
- 唐雎(jū)不辱使命
唐雎(jū)不辱使命 选自<战国策> 秦王使人谓安陵君曰:“寡人欲以五百里之地易安陵,安陵君其许寡人.”安陵君曰:“大王加惠,以大易小,甚善.虽然,受地于先生,愿终守之,弗敢易.”秦王不 ...
- Magento 总结
ZEND EAV 速度 作者:李淼链接:https://www.zhihu.com/question/20656910/answer/25793452来源:知乎著作权归作者所有.商业转载请联系作者获得 ...