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;
}