题意:有n个牛肉堡和n个鸡肉堡给2n个人吃,每个人吃之前抛硬币,正面牛肉,反面鸡肉。如果剩下的都一样,则不抛硬币,问最后两人吃到相同汉堡的概率。
思路:概率题。从反面考虑,1减去吃到不同汉堡的概率。每次抛硬币到某面概率是0.5,有C(2n-2,n-1)种抛法符合情况,即前2n-2次有n-1次正,n-1次反。预处理组合数的对数即可求解。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define INF 1000000
double F[100010];
using namespace std;
inline double logC(int n,int k){
return F[n]-F[k]-F[n-k];
}
int main(){
F[1]=0;
for(int i=2;i<=100000;i++){
F[i]=F[i-1]+log(i);
}
int t;cin>>t;
int n;
while(t--){
cin>>n;
double ans=(n-2)*log(0.5)+logC(n-2,n/2-1);
printf("%.4lf\n",1.0-exp(ans));
}
return 0;
}