[SRM478]RandomApple
题意:有$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的更多相关文章
- SRM478
又是rng_58的神题.. 250pt: 题意:给定一个初始数x,对于这个数可以进行x*4+3,或者x*8+7的操作.最多进行100000次操作 问最少经过几次出现%1000000007 == 0的情 ...
随机推荐
- 01背包入门 dp
题目引入: 有n个重量和价值分别为Wi,Vi的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中的价值总和的最大值. 分析: 首先,我们用最普通的方法,针对每个物品是否放入背包进行搜索. ...
- 24、redis中的sentinel的作用?
redis中的sentinel的作用? Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Re ...
- %和format 细说
Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是format这根本就不算个问题.不信你 ...
- linux驱动基础系列--Linux 串口、usb转串口驱动分析
前言 主要是想对Linux 串口.usb转串口驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如字符设备驱动.平台驱动等也不进行详细说明原理.如果有任何错误地方,请指出, ...
- python基础===基于requests模块上的协程【trip】
今天看博客get了一个有趣的模块,叫做 trip #(pip install trip) 兼容2.7版本 基于两大依赖包:TRIP: Tornado & Requests In Pa ...
- python基础===获取知乎标题时候,文件编码失败的总结
总结一下,关于获取到的信息编码失败. 刚才在执行代码的时候,发现一个问题: 然后修改代码如下: '''爬取知乎界面的标题''' import requests import re import sys ...
- 【LOJ6201】【bzoj4939】【YNOI2016】掉进兔子洞
一道比较简单的莫队…… 用bitset维护三个区间的交元素. #include<bits/stdc++.h> ; ; #define UI unsigned int #define rep ...
- SQL中char、nchar、varchar、nvarchar、text概述【转】
1. char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. 2. nchar ...
- canvas写的地铁地图
更新: 18-9-21:填了个坑,更新了canvas绘制过程. 根据的是百度提供的坐标,canvas的坐标是大的坐标在后面,所以跟实际生活方向相反. 所以canvas里的北方在下方,实际生活中北方在上 ...
- C#ActiveX安装项目
C#开发的ActiveX控件发布方式有三种: 制作客户端安装包,分发给客户机安装: 制作在线安装包,客户机联机安装: 使用html中object的codebase指向安装包地址. 以下为制作安装包: ...