问题描述
共有 n 种图案的印章,每种图案的出现概率相同。小A买了 m 张印章,求小A集齐 n 种印章的概率。
输入格式
一行两个正整数n和m。
输出格式
一个实数P表示答案,保留4位小数。
样例输入
2 3
样例输出
0.7500
解题思路
共有 n 种图案的印章,每种图案的出现概率相同。故买到某种图案的印章的概率为 1/n 。
买了 i 次,集齐 j 种图案。
- 当 i < j 是不可能事件,故概率为 0 ;
- 当 j = 1 时,表达买了 i 次,买的都是同一种,故概率为(1/n)^ j * n ;
- 当 i > j ,j != i 时,分为两种情况:
前 i-1 次买到了 j 种,故第 i 次买到的只能是 j 种中的一种,即 dp [ i-1 ] [ j ] * (1/n)* j;
前 i-1 次买到了 j-1 种,故第 i 次买到的只能是 n-j 种中的一种,即 dp [ i-1 ] [ j-1 ] * (1/n)* (n-j+1)。
代码
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
scanf("%d%d",&n,&m);
double p=1.0/n;
double dp[m+1][n+1];
int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(i<j)
dp[i][j]=0;
else if(j==1)
dp[i][j]=pow(p,i-1);
else
dp[i][j]=dp[i-1][j]*j*p+dp[i-1][j-1]*(n-j+1)*p;
}
}
printf("%.4lf",dp[m][n]);
return 0;
}