[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的情 ...
随机推荐
- bzoj 1588 bst
用set存下就好了. /************************************************************** Problem: 1588 User: BLADE ...
- Part2-HttpClient官方教程-Chapter6-HTTP缓存(HTTP Caching)
原文链接 6.1. 一般概念 HttpClient Cache提供了一个与HTTP / 1.1兼容的缓存层与HttpClient(浏览器缓存的Java等价物.)一起使用.该实现遵循责任链设计模式,其中 ...
- vue路由-基础
安装 1.直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js 在 Vue 后面加载 vue-router,它会自动安装的: <s ...
- yocto 离线编译
使用yocto编译一个软件包时,一般会先在本地寻找下载好的源码包,如果不存在则根据配置从网络下载. 添加本地源码包 为了支持离线编译,添加一个包的配置文件后,需要在本地也准备好源码包. 可以先打开网络 ...
- OpenRCT2-ext
https://github.com/RollingStar/RCT-Music-Patch https://github.com/seanfisk/rct2-game-objects https:/ ...
- sicily 1059. Exocenter of a Trian
Description Given a triangle ABC, the Extriangles of ABC are constructed as follows: On each side of ...
- ACE_INET_Addr类 API
ACE_INET_Addr类,在这个ACE_网络框架中,应该是比较重要的辅助类,该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内.方便用户 ...
- Java将CST的时间字符串转换成需要的日期格式字符串
已知得到的Date类型的变量meettingdate 的值为Sun Dec 16 10:56:34 CST :现在要将它改为yyyy-MM-dd类型或yyyy年MM月dd日: 变为yyyy年MM月dd ...
- python初学-列表
列表操作: 列表一般需要先调用方法后才能打印,不能直接打印调用的方法 因为列表可以修改 一般不会返回一个新列表 # 列表 # new_names = ['lzc','lzc2','lzc3'] # 下 ...
- mysql:视图、触发器、事务、存储、函数、流程控制
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...