注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
明光村小学要开学了,小朋友们要去文具店买新的文具。小朋友们需要的文具有圆规、直尺、橡皮、作业本、铅笔、钢笔、圆珠笔、墨水等等。特殊的是,明光村文具店还售卖冰淇淋,这可是小朋友们的都喜欢的啊!
912班的小朋友们组织一起去排队买文具。可是到文具店的时候,小朋友们发现只有铅笔和作业本还有,而且可以满足所有小朋友的需求,但冰淇淋却很紧缺了。为了有一个良好的秩序,小朋友们一人只能买一种文具(或者冰淇淋),而且只能买一份。yicou小朋友特别喜欢吃冰淇淋了,他不知道排到他的时候还能不能买到冰淇淋了。他踮起脚向前看,知道排在他前面有多少人。他很想知道他能买到冰淇淋的概率是多少。可是yicou现在只会加减法,不知道怎么算。你可以帮帮他吗?
例如yicou前面有2个小朋友,只剩一个冰淇凌
如果有两个小朋友排在yicou的前面,那么这两个小朋友可能选择的情况有
{第一个,第二个}:
1、铅笔,铅笔
2、铅笔,作业本
3、铅笔,冰淇淋
4、作业本,铅笔
5、作业本,作业本
6、作业本,冰淇淋
7、冰淇淋,铅笔
8、冰淇淋,作业本
一共有8种情况,只有在1、2、4、5的情况下,yicou才能买到冰淇淋。那么他能买到冰淇淋的概率位4/8 = 50%。
Input
多组测试数据。每组测试数据包括两个整数,N(1<= N <= 50)和 S(0 <= S <= 50),其中N表示排在yicou前面的小朋友的人数,S表示剩下的冰淇淋的份数。数据以EOF结束
Output
对于每组测试数据,输出yicou能买到冰淇淋的概率,以百分比的形式,且保留到小数点后第5位。
Sample Input
2 1
3 2
4 0
4 1
10 10
14 9
30 14
Sample Output
50.00000
76.92308
0.00000
33.33333
99.99831
98.65515
95.16071
Source
Sapphire@Buptacm
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <stdio.h>
using namespace std;
double C(double a,double b)
{
double i = 1;
double num = 1;
for (; i <=b; i++)
{
num = num * a / i;
a--;
}
return num;
}
double TWO_JC(double n)
{
double num = 1, temp;
//long long m = 0, t1, t2;
double t1;
if (n == 0)
return 1;
else
{
temp = 2;
t1 = 1;
while (n)
{
while (t1 <= n/2)
{
temp = temp * temp;
t1 *= 2;
}
num *= temp;
n -= t1;
t1 = 1;
temp = 2;
}
return num;
}
}
int main()
{
double N, S;
double T, F;
double Z;
while (cin >> N >> S)
{
if (N >= S)
{
T = TWO_JC(N);
for (int i = 1; i <= S; i++)
T += TWO_JC(N-i) * C(N,i);
F = T - TWO_JC(N-S) * C(N,S);
Z = ((double)F / (double)T);
Z *= 100;
}
else
Z = 100;
cout << setiosflags(ios_base::fixed)
<< setprecision(5) << Z << endl;
}
//// system("pause");
return 0;
}