简单概率题。
题目大意: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;
}