LOJ#2541 猎人杀


解:step1:猎人死了之后不下台,而是继续开枪,这样分母不变......
然后容斥,枚举猎人集合s,钦定他们在1之后死。定义打到1的时候结束,枚举游戏在i轮时结束。
发现式子是一个1 + x + x2 + x3 + ... = 1 / (1 - x)
但是枚举子集不现实,发现值域很小,我们用小Z的礼物的套路,考虑计算每个值的容斥系数是多少。
然后就NTT加速了。预处理逆元卡常。
#include <bits/stdc++.h> typedef long long LL;
typedef std::vector<int> Poly; inline void read(int &x) {
x = ;
char c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') {
x = x * + c - ;
c = getchar();
}
return;
} const int N = , MO = ; int A[N << ], B[N << ];
int r[N << ], n, w[N], inv[N]; inline int qpow(int a, int b) {
a = (a % MO + MO) % MO;
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} inline void prework(int n) {
static int R = ;
if(R == n) return;
R = n;
int lm = ;
while(( << lm) < n) lm++;
for(register int i = ; i < n; i++) r[i] = (r[i >> ] >> ) | ((i & ) << (lm - ));
return;
} inline void NTT(int *a, int n, int f) {
prework(n);
for(int i = ; i < n; i++) {
if(i < r[i]) std::swap(a[i], a[r[i]]);
}
for(register int len = ; len < n; len <<= ) {
int Wn = qpow(, (MO - ) / (len << ));
if(f == -) Wn = qpow(Wn, MO - );
for(register int i = ; i < n; i += (len << )) {
int w = ;
for(register int j = ; j < len; j++) {
int t = 1ll * a[i + len + j] * w % MO;
a[i + len + j] = (a[i + j] - t) % MO;
a[i + j] = (a[i + j] + t) % MO;
w = 1ll * w * Wn % MO;
}
}
}
if(f == -) {
LL inv = qpow(n, MO - );
for(int i = ; i < n; i++) {
a[i] = 1ll * a[i] * inv % MO;
}
}
return;
} inline Poly mul(const Poly &a, const Poly &b) {
int na = a.size(), nb = b.size(), n = na + nb - , len = ;
while(len < n) len <<= ;
for(register int i = ; i < na; i++) A[i] = a[i];
for(register int i = ; i < nb; i++) B[i] = b[i];
memset(A + na, , (len - na) * sizeof(LL));
memset(B + nb, , (len - nb) * sizeof(LL));
NTT(A, len, ); NTT(B, len, );
for(register int i = ; i < len; i++) A[i] = 1ll * A[i] * B[i] % MO;
NTT(A, len, -);
Poly ans(n);
for(register int i = ; i < n; i++) ans[i] = A[i];
return ans;
} Poly solve(int l, int r) {
if(l == r) {
Poly a(w[r] + );
a[] = ; a[w[r]] = -;
return a;
}
int mid = (l + r) >> ;
return mul(solve(l, mid), solve(mid + , r));
} int main() {
int sum = ;
read(n);
for(register int i = ; i <= n; i++) {
read(w[i]);
sum += w[i];
} inv[] = inv[] = ;
for(int i = ; i <= sum; i++) {
inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
} std::sort(w + , w + n + );
Poly a = solve(, n); int m = a.size();
int ans = ;
for(register int i = ; i < m; i++) {
ans = (ans + 1ll * a[i] * inv[w[] + i] % MO) % MO;
}
ans = 1ll * ans * w[] % MO;
printf("%d\n", (ans + MO) % MO);
return ;
}
AC代码
LOJ#2541 猎人杀的更多相关文章
- LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)
题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...
- LOJ #2541「PKUWC2018」猎人杀
这样$ PKUWC$就只差一道斗地主了 假装补题补完了吧..... 这题还是挺巧妙的啊...... LOJ # 2541 题意 每个人有一个嘲讽值$a_i$,每次杀死一个人,杀死某人的概率为$ \fr ...
- 【杂题】[LibreOJ 2541] 【PKUWC2018】猎人杀【生成函数】【概率与期望】
Description 猎人杀是一款风靡一时的游戏"狼人杀"的民间版本,他的规则是这样的: 一开始有 n个猎人,第 i 个猎人有仇恨度 wi.每个猎人只有一个固定的技能:死亡后必须 ...
- 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)
[LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...
- 「PKUWC2018」猎人杀
「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...
- LOJ 2541 「PKUWC2018」猎人杀——思路+概率+容斥+分治
题目:https://loj.ac/problem/2541 看了题解才会……有三点很巧妙. 1.分母如果变动,就很不好.所以考虑把操作改成 “已经选过的人仍然按 \( w_i \) 的概率被选,但是 ...
- 【LOJ】#2541. 「PKUWC2018」猎人杀
题解 一道神仙的题>< 我们毙掉一个人后总的w的和会减少,怎么看怎么像指数算法 然而,我们可以容斥-- 设\(\sum_{i = 1}^{n} w_{i} = Sum\) 我们把问题转化一 ...
- loj#2541. 「PKUWC2018」猎人杀
传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...
- [LOJ2541]「PKUWC2018」猎人杀
loj description 有\(n\)个猎人,每个猎人有一个仇恨度\(w_i\),每个猎人死后会开一枪打死一个还活着的猎人,打中每个猎人的概率与他的仇恨度成正比. 现在你开了第一枪,打死每个猎人 ...
随机推荐
- vue的定位
高德定位 https://blog.csdn.net/YY110621/article/details/87921605(copy) 话不多说,直接写方法步骤,需要的直接拿去放在自己项目中即可使用先看 ...
- C# Note32: 查漏补缺
(1)Using的三种使用方式 (2)C#详解值类型和引用类型区别 (3)c#中字段(field)和属性(property)的区别 (4)C#中的 int? int?:表示可空类型,就是一种特殊的值类 ...
- Field tTypeMapper in com.atguigu.project.service.imp.projectInfoServiceImpl required a bean of type 'com.atguigu.project.mapper.TTypeMapper' that could not be found.
解决:MapperScan
- Laravel从入门到精通
1. Laravel框架的下载安装 例如: 在D:\test\laravel目录下新建一个目录为test_laravel 第一步,下载laravel框架 在D:\test\laravel\test_l ...
- delphi 中出现dataset not in edit or insert mode的问题
self.ADOQuery2.Edit;self.ADOQuery2.First;while not self.ADOQuery2.Eof dobeginself.ADOQuery2.FieldByN ...
- Java多线程之静态代理
package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...
- php重定向http请求
302 临时重定向 301 永久重定向 ( 302 和 301 的区别主要在于搜索引擎,搜索引擎一般不会抓取临时重定向的页面 ) 301 和302 适用于 普通的GET 请求: 如果 ...
- Jenkins+PowerShell持续集成环境搭建(一)前期准备
0. 系统要求 Windows Server:本文章使用的为Windows Server 2012 JDK:本文章使用为JDK 1.8 Windows PowerShell:本文章使用为PowerSh ...
- Android系统启动概要
注:Java系统服务与本地系统服务标注反了 1.Linux内核 Android系统启动时,首先通过BootLoader(系统加载器)加载Linux内核,在Linux加载启动时,首先初始化内核,再调用i ...
- 18mysql3
一.内外连接全连接,左右连接 █▓ 通过两张表查找其对应的记录. 隐式 内连接 select * from a,b where a.列名 = b.列名 █▓ 左连接 ...