📅  最后修改于: 2023-12-03 15:12:37.717000             🧑  作者: Mango
此题是 GATE CS 2021 计算机科学门类设置1中的第29题。
让我们定义一个 $n$ 个元素的数列 $a$ 是“良构的”,如果序列 $a$ 中的每个元素都是从 $1$ 到 $n$ 的整数,且满足以下条件:
现在,假设存在一个数组 $A$,初始时所有元素都为 $1$。我们进行了 $m$ 次操作,每次操作可以选择一个整数 $i$,然后将 $A$ 中第 $i$ 个元素加上 $1$。现在,你需要计算,在每个整数 $j$,都可以找到一个时刻 $t$,使得 $A_j$ 在时刻 $t$ 的值是 $j$ 的方案数,要求所有结果模 $10^9+7$ 的结果。
第一行输入两个整数 $n$ 和 $m$。
输出一个整数表示方案数模 $10^9+7$ 的结果。
3 3
7
样例解释:
共有 $7$ 种情况满足条件。
本题是一道比较难的数学题,需要运用一定的数学知识才能够解决。具体解析过程可以参考 这个链接。
下面是 Python 语言的参考代码实现:
def count_ways(n, m):
mod = 1000000007
fac, inv = [1], [1]
for i in range(1, n + 2):
fac.append((fac[-1] * i) % mod)
inv[n + 1] = pow(fac[n + 1], mod - 2, mod)
for i in range(n, -1, -1):
inv[i] = (inv[i + 1] * (i + 1)) % mod
res = 0
for i in range(1, n + 1):
k = m - n
tmp1 = (pow(-1, i) * fac[n] % mod * inv[i] % mod * inv[n - i + 1] % mod) % mod
tmp2 = (pow(i, k, mod) * pow(2 * i - 1, n - i + 1, mod)) % mod
tmp = (tmp1 * tmp2) % mod
res = (res + tmp) % mod
return res