注:最近这一系列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; }