Description
XMU的森爷的身边经常跟着一群的膜法师。有一天森爷想犒劳他的这群总数为N的小迷弟(妹),于是他让他们排成一队给他们发一个红包。红包的发放规则是这样:从队首开始,队首有p的几率获得这个红包,有1-p的概率排到队尾等待下一次机会;若没抢到红包,这时位列第二位的小迷弟将会成为队首并进行同样的操作,这样一直重复到其中一个人拿到红包才停止。
森爷想知道,队列中每一个人抢得红包的概率是多少?
Format
Input
一个整数N(N≤100),表示小迷弟的人数。
一个实数p,代表拿到红包的概率。
Output
N行,第i行输出队列位置为i的人获得红包的概率,保留8位小数。
忽略每行输出的末尾多余空格
样例输入
2 0.5
样例输出
0.66666667 0.33333333
菜的抠脚的我,问过大佬才知道,直接推公式,算就行,是一道概率论题
n个人,第i个人的概率是p*(1-p)^(i-1)+p*(1-p)^(n+i-1)+p*(1-p)^(2n+i-1)+……
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include <stdio.h>
#include <ctype.h>
#include<cmath>
using namespace std;
double f(double a,int c)
{
double ans=1;
if(c==0) return 1;
while(c--)
{
ans*=a;
}
return ans;
}
int main()
{
int n;
double p;
cin>>n>>p;
// cout<<n<<p;
for(int i=1;i<=n;i++)
{
double ans=0,t=0;int c=1;
while(1)
{
t=f(1-p,(c-1)*n+i-1); //这个就是推出来
// cout<<t<<endl;
if(p*t<=0.0000000001) break;
ans+=p*t;
c++;
// cout<<c;
}
printf("%.8f\n",ans);
}
return 0;
}