51nod 抽卡大赛
抽卡大赛
分析:
$O(n^4)$的做法比较好想,枚举第i个人选第j个,然后背包一下,求出有k个比他大的概率。
优化:
第i个人,选择一张卡片,第j个人选的卡片大于第i个人的概率是$p_j$,那么答案的生成函数是:
$\prod \limits _{j = 1}^{n} [j != i]((1 - p_j) + p_jx)$
那么可以将所有人选的卡片按A排序,每次移动,只有一个多项式发生改变,改变的只有一个人,每个人只有一个长度为2的多项式,乘和除都可以做到$O(n)$。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , mod = 1e9 + , inv100 = ; struct Node { int A, G, P, id; } a[N * N];
bool operator < (const Node& x,const Node &y) { return x.A > y.A; }
int f[N], v[N], sump[N], ans[N], n; int ksm(int a,int b) {
int res = ;
while (b) {
if (b & ) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= ;
}
return res;
}
void Div(int p) {
int inv = ksm( - p, mod - );
f[] = 1ll * f[] * inv % mod;
for (int i = ; i < n; ++i) f[i] = 1ll * (f[i] - 1ll * p * f[i - ] % mod) * inv % mod;
}
void Mul(int p) {
for (int i = n - ; i >= ; --i)
f[i] = (1ll * f[i] * (mod + - p) % mod + 1ll * f[i - ] * p % mod) % mod;
}
int main() {
n = read();int cnt = ;
for (int i = ; i <= n; ++i) {
int m = read(), sum = ;
for (int j = ; j <= m; ++j) {
a[++cnt].id = i;
a[cnt].A = read(), a[cnt].G = read(), a[cnt].P = read(); sum += a[cnt].P;
a[cnt].G = 1ll * ( - a[cnt].G) * inv100 % mod;
}
for (int j = ; j < m; ++j)
a[cnt - j].P = 1ll * a[cnt - j].P * ksm(sum, mod - ) % mod;
}
for (int i = ; i < n; ++i) v[i] = read();
sort(a + , a + cnt + );
f[] = ;
for (int i = ; i <= cnt; ++i) {
if (a[i].id != a[i - ].id) {
Div(sump[a[i].id]);
Mul(sump[a[i - ].id]);
}
for (int j = ; j < n; ++j)
ans[a[i].id] = (ans[a[i].id] + 1ll * f[j] * v[j] % mod * a[i].P % mod * a[i].G) % mod;
sump[a[i].id] = (sump[a[i].id] + a[i].P) % mod;
}
for (int i = ; i <= n; ++i) printf("%d\n", (ans[i] + mod) % mod);
return ;
}
51nod 抽卡大赛的更多相关文章
- 51nod 1850 抽卡大赛 (十二省联考模测) DP
O(n4)O(n^4)O(n4)的DP很好想,但是过不了.来看看O(n3)O(n^3)O(n3)的把. Freopen的博客 CODE #include <cstdio> #include ...
- 十二省NOI“省选”联考模测(第二场)A抽卡大赛
/* dp维护整体的概率, 每次相当于回退一格然后重新dp一格 */ #include<cstdio> #include<algorithm> #include<iost ...
- [51Nod1850] 抽卡大赛
link $solution:$ 朴素 $dp$,暴力枚举选择 $i$ 号人的第 $j$ 张卡片,朴素 $dp$ 即可,时间复杂度 $O(n^4)$ . 考虑对于朴素 $dp$ 的优化,发现其实是一个 ...
- 三色抽卡游戏 博弈论nim
你的对手太坏了!在每年的年度三色抽卡游戏锦标赛上,你的对手总是能打败你,他的秘诀是什么? 在每局三色抽卡游戏中,有n个卡组,每个卡组里所有卡片的颜色都相同,且颜色只会是红(R).绿(G).蓝(B)中的 ...
- [CSP-S模拟测试]:抽卡(概率DP)
题目描述 水上由岐最近在肝手游,游戏里有一个氪金抽卡的活动.有$n$种卡,每种卡有 3 种颜色.每次抽卡可能什么也抽不到,也可能抽到一张卡.每氪金一次可以连抽 m 次卡,其中前$m−1$次抽到第$i$ ...
- Java实现 蓝桥杯 算法提高 抽卡游戏
试题 算法提高 抽卡游戏 某个抽卡游戏卡池抽出限定卡的概率为p,该游戏有一个"井"的机制,抽满k次卡后直接送这张限定卡.试求获得这张限定卡需要的期望抽卡次数.输入为一行,用空格隔开 ...
- [loj3315]抽卡
令$S$表示对于某一种抽卡顺序中某一段长度为$k$的段全部被抽到的时间(这里没有期望)所构成的集合,根据$min-max$容斥的公式,有$E(\min(S))=\sum_{T\subseteq S}( ...
- 51nod 省选联测 R2
51nod 省选联测 R2 上场的题我到现在一道都没A,等哪天改完了再写题解吧,现在直接写第二场的. 第二场比第一场简单很多(然而这并不妨碍我不会做). A.抽卡大赛:http://www.51nod ...
- C#入门经典第十章例题 - - 卡牌
1.库 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
随机推荐
- 遇到npm报错read ECONNRESET怎么办
遇到npm 像弱智一样报错怎么办 read ECONNRESET This is most likely not a problem with npm itselft 'proxy' config i ...
- [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用)-布布扣-bubuko.com - Google Chrome
[Kali_Debian] 清除无用的库文件(清理系统,洁癖专用) 时间:2014-11-07 16:25:36 阅读:1486 评论:0 收藏:0 [点我收藏 ...
- Scala多重继承及AOP
package traitandclass /** * Created by zhen on 2018/8/23. */ class Human { println("Human" ...
- ORACLE11g下如何利用SQL DEVELOPER连接上数据库
最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...
- 安装SQL 2005 出现警告 ,32位ASP.NET已经注册,需要注册64位
将64位.net注册到iis上 cscript C:\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 ...
- django 简单路由配置
Django==2.0.1 版本路由配置: 1.在manage.py同级目录下新建一个应用app1 在app1下新建urls.py文件,定义一个app1的空白路由: from django.urls ...
- Centos7下安装与卸载docker应用容器引擎
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- Hibernate 中的 idclass mapping 问题
关于出现 idclass mapping 运行错误 @IdClass 注释通常用于定义包含复合键id的Class.即多个属性的关键复合. @IdClass(CountrylanguageEntityP ...
- fedora输入法
fedora自带输入法,另外如果自己鼓捣的话很可能身心俱疲. 打开设置(在桌面右击也能打开) 区域和语言 在输入源中添加 汉语(中国) 快捷键 输入源切换:win+space 中英文切换:shift
- Properties集合概述与存和取
Properties集合:(Map集合下的Hashtable集合下的一个子类) 特点: 1.集合中的键和值都是字符串 2.集合中的数据可以保存到流中,或者从流中获取 该集合通常用于操作以键值对形式存在 ...