资源限制
内存限制: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
n, m = map(int, input().split())
if n > m:
print("0.0000")
else:
# 如果m>n,则用二维数组存放结果,i代表手里有的印章数,j代表已有的印章种类数,s[1][1]默认为1,后面的都是由前面的数据进一步计算得到的
# 比如s[2][2]代表手里有两个,是同两种的概率,即由s[1][1]乘以一个不与之前相同的概率 加上s[1][2]乘以与之前的任意一种相同种类的概率
# 以此类推计算到最后输出即可
s = [[0 for i in range(m + 1)] for j in range(m + 1)]
s[1][1] = 1
for i in range(2, m + 1):
for j in range(1, i + 1):
s[i][j] = s[i - 1][j - 1] * (n - j + 1) / n + s[i - 1][j] * (j / n)
print("{:.4f}".format(float(s[m][n])))