简单概率题。
题目大意:Amjad去买菜,在他的前面有n人,Indomie有s份,他需要买到名为Indomie的菜,问这种可能的概率是多少?
思路:假设共有i人不买Indomie,则不买Indomie的方案有C(n,i)*2^n-i; //其他的人去买Rice或者Sugar.
以购买Indomie的份数分类,则所有的方案是 S1 = A0+A1+A2+A3+A4……As;
而还有剩余的Indomie的方案是S2 = A0+A1+A2+A3+A4…….As-1;
所以,概率就是S1/S2%。注意要考虑s>n与s == 0的情况。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 101;
int N, S;
__int64 pow2[SIZE];
void init() //2的幂
{
int s = 1;
pow2[0] = 1;
for(int i = 1; i <= 50; i++)
{
pow2[i] = pow2[i-1]*2;
}
return ;
}
double PAC(int n, int m) //Permutation and Combination,注意要用double
{
double s = 1, i;
for(i = 0; i < m; i++)
s *= (n-i)/(i+1);
return s;
}
int main()
{
int i, j;
int n, s;
init();
while(~scanf("%d%d", &n, &s))
{
double sum1 = 0, sum2 = 0;
if(s == 0) // s == 0
{
printf("0.00000\n");
continue;
}
if(s > n) // s > n
{
printf("100.00000\n");
continue;
}
for(i = 0; i <= s; i++)
{
sum1 += PAC(n, i)*pow2[n-i];
if(i == s-1)
{
sum2 = sum1;
}
}
printf("%.5lf\n", 100.0*sum2/sum1);
}
return 0;
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 101;
int N, S;
__int64 pow2[SIZE];
void init() //2的幂
{
int s = 1;
pow2[0] = 1;
for(int i = 1; i <= 50; i++)
{
pow2[i] = pow2[i-1]*2;
}
return ;
}
double PAC(int n, int m) //Permutation and Combination,注意要用double
{
double s = 1, i;
for(i = 0; i < m; i++)
s *= (n-i)/(i+1);
return s;
}
int main()
{
int i, j;
int n, s;
init();
while(~scanf("%d%d", &n, &s))
{
double sum1 = 0, sum2 = 0;
if(s == 0) // s == 0
{
printf("0.00000\n");
continue;
}
if(s > n) // s > n
{
printf("100.00000\n");
continue;
}
for(i = 0; i <= s; i++)
{
sum1 += PAC(n, i)*pow2[n-i];
if(i == s-1)
{
sum2 = sum1;
}
}
printf("%.5lf\n", 100.0*sum2/sum1);
}
return 0;
}