题目描述
概率一直是计算机算法中不可或缺的一部分。当确定性算法不能在短时间内解决一个问题时,就要用概率算法。在本题中,我们并不应用概率算法来解决问题。我们只是要确定某个玩家的获胜概率。 一个游戏是通过掷骰子一样的东西来玩的(并不设定它像普通骰子一样有六个面)。当一个玩家掷骰子时,如果某个预定情况发生(比如骰子显示3的一面朝上,绿色的一面朝上,等等),他就赢了。现在,有n个玩家。因此,先是第一个玩家掷骰子,然后第二个掷骰子,最后是第n个玩家掷骰子,再接下来,下一轮,先第一个玩家掷骰子,以此类推。当一个玩家掷骰子得到了预定的情况,他或她被宣布为赢家,比赛终止。请您确定其中一个玩家(第i个玩家)的获胜概率。
输入输出格式
输入格式 输入首先给出一个整数s(s≤1000),表示有多少个测试用例。接下来的s行给出s个测试用例。每行先给出一个整数n(n≤1000),表示玩家人数;然后给出一个浮点数字p,表示单次掷骰子时成功事件发生的概率(如果成功事件是骰子显示3的一面朝上,则p是单次掷骰子时显示3的一面朝上的概率)。对于普通骰子,显示3的一面朝上的的概率是1/6);最后给出一个i(i≤n),表示要确定其获胜概率的玩家的序列号(序列号从1到n)。本题设定,在输入中,没有无效的概率(p)值。
输出格式 对于每一个测试用例,在一行中输出第i个玩家获胜的概率。输出浮点数在小数点后总是有四位数字,如样例输出所示。
输入输出样例1
输入
2
2 0.166666 1
2 0.166666 2
输出
0.5455
0.4545
#include <stdio.h> int main() { int T,n,id; double p; scanf("%d",&T); while(T--) { scanf("%d%lf%d",&n,&p,&id); double q=1-p; double tmp=q; for(int i=1;i<n;i++) { tmp*=q; } double a=1; for(int i=1;i<id;i++) { a*=q; } printf("%.4lf\n",p==0?0:(a*p)*1/(1-tmp)); } }