[Gym-101201K]

来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/05/17 01:22
/*************************************************************************    > Author: MentalOmega    > Mail: 965194745@qq.com    > Created Time: 2017年10月7日    > function:题意说的是有2^k个人两两打淘汰赛,排名靠前的一定会在两两对局中打败排名后的,在随机开局中问排名第r的人    赢的场数的期望是多少。最重要的一点是最后的期望胜场数=∑至少胜i场的概率*i    那么要赢i场,那么跟排第r一起的还需要在比第r后的人中再选出2^i-1个人来,概率显然是C(2^k-r,2^i-1) / C(2^k,2^i-1)    剩下的问题是考虑这个除法的精度问题,用取对数的方法来解决。 ************************************************************************/#include<bits/stdc++.h>using namespace std;const int MAXN = 1<<20;long double logfac[MAXN];long double A(int m,int n){    return logfac[m]-logfac[m-n];}int main(){    if (fopen("in.txt", "r") != NULL)    {        freopen("in.txt", "r", stdin);        // freopen("out.txt", "w", stdout);    }    for(int i=1;i<MAXN;i++)        logfac[i]=logfac[i-1]+log(i);    int k,r;    while(~scanf("%d%d",&k,&r))    {        long double ans = 0;        int n=1<<k;        for(int i=1;i<=k;i++)        {            int need = (1<<i)-1;            if(need>n-r) break;            ans += exp(A(n-r,need)-A(n-1,need));        }        printf("%.5f\n",(double)ans);    }    return 0;}
原创粉丝点击