题意:有$k$种苹果和$n$个箱子,每个箱子中有一些苹果,先等概率选取$n$个箱子组成集合的非空子集,再从选出的苹果中随机选一个,问每种苹果被选中的概率是多少

设箱子$i$有$cnt_{i,j}$个第$j$种苹果,第$i$个箱子的总苹果数$siz_i=\sum\limits_{j=1}^kcnt_{i,j}$,苹果总数$sum=\sum\limits_{i=1}^nsiz_i$

因为选完非空子集后,每个箱子中的苹果被选中的概率是相同的,所以先考虑选箱子,设$f_{i,j}$表示在前$i$个箱子中选$j$个苹果的方案数(只能一箱一箱选),那么$f_{i,j}=f_{i-1,j}+f_{i-1,j-siz_i}$

再设$g_{i,j}$表示在所有不是$i$的箱子中选$j$个苹果的方案数,那么$g_{i,j}=f_{n,j}-g_{i,j-siz_i}$

于是,选中了箱子$i$的情况对箱子$i$中每个苹果被选中的概率贡献为$\frac1{2^n-1}\sum\limits_{j=0}^{sum-siz_i}\frac{g_{i,j}}{j+siz_i}$(枚举箱子$i$外被选中的苹果数)

#include<stdio.h>
#include<vector>
#include<string>
#include<string.h>
using namespace std;
typedef double du;
typedef long long ll;
ll f[500010],g[500010];
int cnt[60][60],siz[60],sum;
class RandomApple{
	public:
		vector<du>theProbability(vector<string>hun,vector<string>ten,vector<string>one){
			int n,k,i,j;
			du t;
			n=hun.size();
			k=hun[0].length();
			for(i=0;i<n;i++){
				for(j=0;j<k;j++){
					cnt[i][j]=(hun[i][j]-'0')*100+(ten[i][j]-'0')*10+one[i][j]-'0';
					siz[i]+=cnt[i][j];
				}
				sum+=siz[i];
			}
			vector<du>res(k,0);
			f[0]=1;
			for(i=0;i<n;i++){
				for(j=sum;j>=siz[i];j--)f[j]+=f[j-siz[i]];
			}
			for(i=0;i<n;i++){
				memset(g,0,sizeof(g));
				t=0;
				for(j=0;j<=sum;j++){
					g[j]=f[j]-(j>=siz[i]?g[j-siz[i]]:0);
					if(j+siz[i]<=sum)t+=g[j]/(du)((1ll<<n)-1)/(du)(j+siz[i]);
				}
				for(j=0;j<k;j++)res[j]+=t*cnt[i][j];
			}
			return res;
		}
};
/*
int main(){
	RandomApple cl;
	vector<string>a,b,c;
	vector<du>res;
	char s[60];
	for(scanf("%s",s);s[0]!='-';scanf("%s",s))a.push_back(s);
	for(scanf("%s",s);s[0]!='-';scanf("%s",s))b.push_back(s);
	for(scanf("%s",s);s[0]!='-';scanf("%s",s))c.push_back(s);
	res=cl.theProbability(a,b,c);
	for(du t:res)printf("%.9lf ",t);
}
*/

[SRM478]RandomApple的更多相关文章

  1. SRM478

    又是rng_58的神题.. 250pt: 题意:给定一个初始数x,对于这个数可以进行x*4+3,或者x*8+7的操作.最多进行100000次操作 问最少经过几次出现%1000000007 == 0的情 ...

随机推荐

  1. 深入理解 JavaScript(五)

    根本没有“JSON 对象”这回事! 前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为 JSON 对象,把 JSON 对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下 ...

  2. bootstrap-table组合表头

    1.效果图 2.html代码 <table id="table"></table> 3.javascript代码 $("#table") ...

  3. 史诗级Java/JavaWeb学习资源免费分享

    黑马内部视频+相关配套学习资料 Java Spring 技术栈构建前后台团购网站 Java SSM开发大众点评后端 欢迎关注微信公众号:Java面试通关手册 回复关键词: "资源分享第一波& ...

  4. mysql增删

    create table msg (id int, name varchar(10)); 插入语句 insert into msg values(1,'root'); insert into msg( ...

  5. Python3 PyPAML 模块(配置文件的操作)

    YAML 是专门用来写配置文件的语言,非常简洁和强大 它的基本语法规则如下: 1.大小写敏感 2.使用缩进表示层级关系 3.缩进时不允许使用Tab键,只允许使用空格. 4.缩进的空格数目不重要,只要相 ...

  6. 比特币编译(Ubuntu 16.04)

    安装比特币需要的所有库 sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-de ...

  7. Scrapy爬虫:抓取大量斗图网站最新表情图片

      一:目标 第一次使用Scrapy框架遇到很多坑,坚持去搜索,修改代码就可以解决问题.这次爬取的是一个斗图网站的最新表情图片www.doutula.com/photo/list,练习使用Scrapy ...

  8. ServerSocket和Socket通信

    服务器端: 1.服务器端建立通信ServerSocket对象,并设置端口号 2.服务器建立Socket接收客户端连接 3.建立IO输入流读取客户端发送的数据 4.建立IO输出流向客户端输出数据 客户端 ...

  9. HTML5API(2)

    四.文件API 1.概述 H5允许JS有条件的读取客户端文件 允许读取的文件:1.待上传的文件2.拖进浏览器的文件 多文件上传设置属性multiple 过滤上传文件类型 设置accept属性 acce ...

  10. leetcode 之Swap Nodes in Pairs(21)

    不允许通过值来交换,在更新指针时需要小心. ListNode *swapNodes(ListNode* head) { ListNode dummy(-); dummy.next = head; fo ...