解: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 猎人杀的更多相关文章

  1. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  2. LOJ #2541「PKUWC2018」猎人杀

    这样$ PKUWC$就只差一道斗地主了 假装补题补完了吧..... 这题还是挺巧妙的啊...... LOJ # 2541 题意 每个人有一个嘲讽值$a_i$,每次杀死一个人,杀死某人的概率为$ \fr ...

  3. 【杂题】[LibreOJ 2541] 【PKUWC2018】猎人杀【生成函数】【概率与期望】

    Description 猎人杀是一款风靡一时的游戏"狼人杀"的民间版本,他的规则是这样的: 一开始有 n个猎人,第 i 个猎人有仇恨度 wi.每个猎人只有一个固定的技能:死亡后必须 ...

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

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

  5. 「PKUWC2018」猎人杀

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

  6. LOJ 2541 「PKUWC2018」猎人杀——思路+概率+容斥+分治

    题目:https://loj.ac/problem/2541 看了题解才会……有三点很巧妙. 1.分母如果变动,就很不好.所以考虑把操作改成 “已经选过的人仍然按 \( w_i \) 的概率被选,但是 ...

  7. 【LOJ】#2541. 「PKUWC2018」猎人杀

    题解 一道神仙的题>< 我们毙掉一个人后总的w的和会减少,怎么看怎么像指数算法 然而,我们可以容斥-- 设\(\sum_{i = 1}^{n} w_{i} = Sum\) 我们把问题转化一 ...

  8. loj#2541. 「PKUWC2018」猎人杀

    传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...

  9. [LOJ2541]「PKUWC2018」猎人杀

    loj description 有\(n\)个猎人,每个猎人有一个仇恨度\(w_i\),每个猎人死后会开一枪打死一个还活着的猎人,打中每个猎人的概率与他的仇恨度成正比. 现在你开了第一枪,打死每个猎人 ...

随机推荐

  1. 在linux上安装Scala详细步骤

    scala在linux安装很简单,就是下载,解压,配置环境变量,source一下成功. 提君博客原创 >>提君博客原创 http://www.cnblogs.com/tijun/ < ...

  2. hashCode和equals的关系分析

    hashCode:说白了,简单的就看做一个函数,但是该函数有可能出现:对于某个x值,存在不止一个y值与之对应.这种情况就叫哈希碰撞. 那么: 1.如果hashCode相等,两个对象不一定是同一个对象( ...

  3. Ubuntu18.04安装mysql5.7

    Ubuntu18.04安装mysql5.7 1.1安装 首先执行下面三条命令: # 安装mysql服务 sudo apt-get install mysql-server # 安装客户端 sudo a ...

  4. django migrate报错(提前删除表等)

    python3 manage.py makemigrations python3 manage.py migrate ##报错 改为##更改migrates的状态 python3 manage.py ...

  5. 关于浏览器兼容问题——还有移动端meta问题

    <!DOCTYPE html><!--[if lt IE 7]> <html dir="ltr" lang="en-US" cla ...

  6. python之if使用方法举例

    if使用方法举例: import random #随机生成1-100的整数 n = random.randint(1, 100) if n > 50: print(n, "> 5 ...

  7. 五、compose 部署 GitLab 应用

    1.我们部署的是sameersbn/docker-gitlab这个镜像. docker pull sameersbn/gitlab 2.配置文件,我们不需要去run它,只需要先下载一个compose的 ...

  8. Lodop输出页面input文本框的最新值

    默认使用Lodop打印页面上的文本框等,会发现虽然页面上文本框输入了值,打印预览却是空的,这是由于没有把最新的值传入Lodop. 如图,演示的是Lodop如何输出文本框内的新值,这里整个页面只有inp ...

  9. Spring Boot 构建电商基础秒杀项目 (一) 项目搭建

    SpringBoot构建电商基础秒杀项目 学习笔记 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 maven 整合了所有的 jar 包, Spring Boot ...

  10. 使用脚本调用maven命令后脚本直接退出问题

    在带有maven命令的bat脚本执行的时候,执行完一个mvn 目标后会自动退出,pause命令也无效. 原因:mvn本身是一个bat命令,因此在exit退出的时候,整个脚本进程将退出,加入call命令 ...