传送门https://www.luogu.com.cn/problem/AT_abc126_c
------------
题意
先得到一个在1~n之间的正整数,(抽取到每个数的概率为1~n),若该数的范围为[1,k−1],那么就投硬币,注意只能投到正面,反面就输了。若这个数>k,那么就成功了。现在求赢的概率
------------
思路
如果这个面的点数≥n,这个面的概率就是1~n,否则这个点数不断×2,P也不断÷2,直到这个点数 ≥n为止
------------
解法
#include<bits/stdc++.h>
#define db double
int n,k,m;
db ans;
int main()
{
cin>>n>>k;//常规输入
for(int i=1;i<=n;i++) //枚举
{
db gl=1.0/n; //概率
m=i;
while(m<k)
{
m*=2,gl/=2.0;//几率翻倍
}
ans+=gl;
}
printf("%.12lf\n",ans);//更方便的输出
return 0;
}