UVA 557 - Burger (概率+对数处理)
题目链接 https://cn.vjudge.net/problem/UVA-557
【题意】
有n个牛肉汉堡和n个鸡肉汉堡给2n个孩子吃,每个孩子在吃以前都要抛硬币,正面吃牛肉汉堡,反面吃鸡肉汉堡。如果剩下的汉堡都一样,那么不用抛硬币。求最后两个孩子吃到相同汉堡的概率.
【思路】
考虑对立事件,也就是最后两个孩子吃到不同汉堡的概率,说明前面的 个孩子吃掉了 个牛肉汉堡和 个鸡肉汉堡,并且他们每次吃以前都会抛硬币决定,那么这个概率就是
用1减去这个概率就是答案了,组合数会很大所以要先用对数处理
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n;
double Ln[maxn];
void init(){
for(int i=2;i<maxn;++i){
Ln[i]=Ln[i-1]+log(i);
}
}
int main(){
init();
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
n/=2;
double ans=Ln[2*n-2]-2*Ln[n-1]+(2*n-2)*log(0.5);
ans=1.0-exp(ans);
printf("%.4lf\n",ans);
}
return 0;
}