/*************************************************************************
> 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;
}
[Gym-101201K]
最新推荐文章于 2018-10-10 23:05:00 发布