资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
输入格式
一行两个正整数n和m
输出格式
一个实数P表示答案,保留4位小数。
样例输入
2 3
样例输出
0.7500
数据规模和约定
1≤n,m≤20
package 算法训练;
import java.util.Scanner;
public class 印章 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
double d[][]=new double[21][21];// i张印章凑齐j种印章数的概率。
int i,j;
double p=1.0/n;
for(i=1;i<=m;i++) {
for(j=1;j<=m;j++) {
if(i<j) {
d[i][j]=0;//凑不齐
}else if(j==1) {
d[i][j]=Math.pow(p,(i-1));//(p^i)*n,不确定多出来的是第几种
}else {
d[i][j]=d[i-1][j]*(j*p)+d[i-1][j-1]*(n-j+1)*p;
//d[i-1][j]*(j*p)为当前第i种与前面j中重复;
//d[i-1][j-1]*(n-j+1)*p为当前第i种与j-1种不重复;
//他两概率和为d[i][j]的概率
}
}
}
System.out.printf("%.4f",d[m][n]);
}
}