[51nod 1850] 抽卡大赛

问题描述

51Nod为了活跃比赛前的气氛,组织了场抽卡比赛。这场比赛共 n 个人参加,主办方根据非欧血统鉴定器,得到了一些数据。每个人抽卡有 Mi 种可能,得到的卡能力值为 Aij 代价为 Gij 的可能性为 Pij ,所谓代价指的是玩家需要将一轮比赛后所得的点头盾的 Gij% 交给主办方。每轮比赛每个人都随机抽取卡片,待全部人抽取完毕后进行排名(按照A从大到小排),排在第 i 位的人有 Vi 的点头盾收入。现在主办方想知道一轮比赛后每个人的期望收入。

输入格式

第一行一个正整数 n

接下来 n 个部分

每个部分第一行为正整数 Mi,接下来 Mi 行有三个整数 Aij Gij Pij

接下来一行 n 个整数,分别为 Vi

设 ∑Pij=Qi,则第 i 个人抽到第 j 张卡的概率为 Pij/Qi

1<=n,Mi<=200,1<=Aij<=1000000000,保证 Aij 互不相同,0<=Gij<=100,1<=Pij<=1000,1<=Vi<=1000

输出格式

输出 n 行,每行一个数表示每个人的期望收入

为了防止精度误差,输出答案在模 1e9+7 意义下的数值

样例输入

2

2

3 50 5

4 50 5

2

5 50 5

6 50 5

2 2

样例输出

1

1

解析

O(n^4)的做法比较好想。回想这个做法,可以发现最麻烦的一点是求每个人排名多少的概率。考虑优化这一过程。

假设当前考虑第\(i\)个人。设\(p_j\)表示第\(j\)个人排名比\(i\)靠前的概率,\(f[j]\)表示第\(i\)个人排名为j的概率。结合生成函数的知识,\(f\)数列的生成函数即为

\[\prod_{j!=i}p_j\times x+(1-p_j)
\]

\(f[i]\)即对应上面多项式展开后的i-1次项。所以,我们将所有卡牌按照a从大到小排序,如果当前卡牌对应的人的排名要往后,就必须要在这张牌之前的牌中选一张。我们需要维护上面的多项式。具体的,设当前人为i,那么\(p[j]\)就是j前面出现的所有卡牌的概率之和。由于多项式满足\(i!=j\),我们要将当前的多项式除以\(p_i\times x+1-p_i\),然后乘上\(p_j\times x+1-p_j\)。手动模拟一下两个多项式相乘的过程就可以解决这个问题了。

当然也可以NTT

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 202
using namespace std;
const int mod=1000000007;
struct card{
	int a,g,p,id;
}a[N*N];
int n,m[N],v[N],cnt,i,j,f[N],ans[N],p[N];
int read()
{
	char c=getchar();
	int w=0;
	while(c<‘0‘||c>‘9‘) c=getchar();
	while(c<=‘9‘&&c>=‘0‘){
		w=w*10+c-‘0‘;
		c=getchar();
	}
	return w;
}
int poww(int a,int b)
{
	int ans=1,base=a;
	while(b){
		if(b&1) ans=ans*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return ans;
}
int my_comp(const card &x,const card &y)
{
	return x.a>y.a;
}
signed main()
{
	n=read();
	for(i=1;i<=n;i++){
		m[i]=read();
		int inv=0;
		for(j=1;j<=m[i];j++){
			cnt++;
			a[cnt].a=read(),a[cnt].g=read(),a[cnt].p=read();
			a[cnt].id=i;
			a[cnt].g=(100-a[cnt].g)*poww(100,mod-2)%mod;
			inv=(inv+a[cnt].p)%mod;
		}
		inv=poww(inv,mod-2);
		for(j=1;j<=m[i];j++) a[cnt-j+1].p=a[cnt-j+1].p*inv%mod;
	}
	for(i=1;i<=n;i++) v[i]=read();
	sort(a+1,a+cnt+1,my_comp);
	f[1]=1;
	for(i=1;i<=cnt;i++){
		if(a[i-1].id!=a[i].id){
			int inv=poww(1-p[a[i].id]+mod,mod-2);
			f[1]=f[1]*inv%mod;
			for(j=2;j<=n;j++) f[j]=(f[j]-f[j-1]*p[a[i].id]%mod+mod)%mod*inv%mod;
			for(j=n;j>=1;j--) f[j]=(f[j]*(1-p[a[i-1].id]+mod)%mod+f[j-1]*p[a[i-1].id]%mod)%mod;
		}
		for(j=1;j<=n;j++) ans[a[i].id]=(ans[a[i].id]+f[j]*v[j]%mod*a[i].p%mod*a[i].g%mod)%mod;
		p[a[i].id]=(p[a[i].id]+a[i].p)%mod;
	}
	for(i=1;i<=n;i++) printf("%lld\n",ans[i]);
	return 0;
}

原文地址:https://www.cnblogs.com/LSlzf/p/12616610.html

时间: 2024-11-01 19:51:38

[51nod 1850] 抽卡大赛的相关文章

抽卡概率的测试

截取了我最近写的一个文档. 关于抽卡概率 1.先验证策划的概率是否有伪概率和用脚本控制的,以下为例子(pro代表倍率,pro6最高) 例子如下: id gold pro1 pro2 pro3 pro4 pro5 pro6 1 88 0 0 0 0 20 30 2 288 0 0 0 0 30 20 3 988 0 0 20 0 15 5 4 1988 10 20 10 0 2 0 5 3888 15 25 20 5 0 0 花钱越多,pro5和pro6倍率最高的实际无法给转到. 这里选择用脚本控

2020春节写的崩坏3抽卡单机模拟程序

2020年的春节新型冠状病毒引发了肺炎. 寒假延长,在家心血来潮写了一个崩坏3抽卡模拟程序(单机而已,仅供娱乐) 只有极简的功能,上代码: 1 package Analogy; 2 3 import javax.swing.*; //图形用户界面 4 import java.awt.*; 5 import java.awt.event.*; 6 import java.io.*; 7 import java.text.SimpleDateFormat; 8 import java.util.*;

51Nod 1453 抽彩球

1453 抽彩球 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个袋子中有n个彩球,他们用k种不同的颜色染色.颜色被从1到k编号.同一种颜色的球看成是一样的.现在从袋中一个一个的拿出球来,直到拿完所有的球.对于所有颜色为i (1<=i<=k-1)的球,他的最后一个球总是在编号比他大的球拿完之前拿完,问这样情况有多少种. 样例解释:这个样例中有2个1号颜色的球,2个2号颜色的球,1个3号颜色的球.三种方案是

内部考试总结

2019年8月5日星期一 Kos 题目描述 有\(n\)个人,他们之间将会有\(m\)场比赛(两个人之间可能有多场比赛,但这些比赛的结果不一定完全相同),问获胜场次最多的人获胜的场次数最少 限制范围 \(Time:1000ms\quad Space:512MB\) \(1\le n\le 10^4,0\le m\le 10^4\) 正解算法 建立二分答案,对猜测解\(x\),考虑建立最大流模型 对每场比赛和每个人都建立一个点,从源点向每场比赛连一条容量为\(1\)的边,每个选手向汇点连一条容量为

《阴阳师》刷成“爆款” 阴阳才是成功的第五元素

所谓阴阳,恰恰是男女比例和谐.那些对游戏"无感"的女青年,或许是被日式和风的画面.潇洒俊逸的人物设计所吸引,进入到游戏中来了,而且有一部分成了深度玩家. 文/张书乐 原载于<人民邮电报>2017年1月20日<乐游记>专栏130期 "这款游戏开发团队早期只有9个人,自己对游戏的预期原本是在畅销榜50名左右的位置."<阴阳师>制作人金韬在游戏成为"爆款"后如是说. 此前的专栏分析过这款游戏成功的部分因素,实际上,成

网游新规来袭,玩家还要为《阴阳师》费氪伤肝吗?

是否这一新规,会让阴阳师的火爆出现变数呢?欧洲人,非洲人的问题将变得不难么重要了呢? 文/张书乐 日前,文化部在其官网发布<关于规范网络游戏运营加强事中事后监管工作的通知>(以下称<通知>),其中规定,网络游戏运营企业应当在游戏的官方网站或者游戏内显著位置公布参与用户的随机抽取结果.目前,几乎所有的游戏都没有公布抽卡概率,包括近期最为火爆的<阴阳师>,该游戏ssr的获得概率一直是个谜.那么,新规的实行,是否会对<阴阳师>等爆款游戏产生影响? 对此,每日经济新

排序-InsertionSort 插入排序

插入排序 の implementation 插入排序就像打赌的时候,比如双扣.抽牌的时候,一次拿一张牌,这张牌和之前的牌一张张比较.选择把这张牌插入什么位置,排好顺序的位置后打牌更顺.要不然得一个一个找到时麻烦.也不利于打牌的大局观.看下图 假设第一次抽到梅花7, 不用排序.因为只有一张 接着抽到梅花10 .因为10比7大,所以不用排序. 再接着抽卡.发现抽到了梅花5 .这个时候不要犹豫,2点真的不算大的.果断弃牌 接着我们拿 5 和 10 比较. 5 小于 10 所以交换位置. 拿5再和7比.

由《怪物弹珠》浅谈游戏的本地化

众所周知,<怪物弹珠>是原家用机游戏制作人--冈本吉起在离开CAPCOM后沉寂许久之后的成名作.其作为社交游戏,从2013年推出至今,依然在日本APPStoue处于"霸榜"的地位,甚至一度超过了当时日本的"国民手游"--<智龙迷城>,被誉为"不可思议的G". 图中排位第一的便是日服的<怪物弹珠>了 那么,这样一款游戏能够受到日本全民的欢迎,可见其在游戏性.社交性方面都做到了优秀的地步.但正是这样一款游戏,在中国

Bzoj3566 [SHOI2014]概率充电器

Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 999  Solved: 428 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元