题意:有$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. [Unity]多线程编程的一点心得

    在做毕设的时候涉及到了较大数据的读取,每次从硬盘读都会卡很久,于是找资料之后自己做了个简单的多线程解决方案. 一共有两个类.第一个类ThreadJob如下: using System.Collecti ...

  2. for in、each; for 、forEach、map

    1.jQuery.each(object, [callback]) 用于例遍任何对象.回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容.如果需要退出 each 循环可使回调 ...

  3. Webmin LFD to LFI

    Webmin < 1.290 / Usermin < 1.220 - Arbitrary File Disclosure (Perl) https://www.exploit-db.com ...

  4. interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程

    interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ...

  5. C11 标准特性研究

    前言 - 需要点开头 C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准. 相比C99,C11有哪些变化呢!!所有的测试全部基于能够和标准贴合的特性平台. 但 ...

  6. Pretrained models for Pytorch (Work in progress)

    The goal of this repo is: to help to reproduce research papers results (transfer learning setups for ...

  7. Python的数值和字符串

    Python数据类型 1.数值 --类型:  1/整型 2/长整型   3/浮点型 -- 0.0, 12.0, -18.8, 3e+7等 4/复数型 -- complex  In []: 0x34al ...

  8. MyBatis根据数组、集合查询

     foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.it ...

  9. mac date 和 Linux date实现从指定时间开始循环

    Linux date begin="2016-01-01" ; i < ; i++ )); do current=$(date -d "$i day $begin& ...

  10. POJ 2912 Rochambeau(种类并查集+枚举)

    题目链接:http://poj.org/problem?id=2912 题目大意:n个人玩,玩石头剪刀布游戏,其中1人是裁判,剩下的n-1个人分为3组, 他们商量好了,相同组的人每次都出相同的手势,不 ...