📜  门| GATE CS 2021 |设置 1 |问题 29(1)

📅  最后修改于: 2023-12-03 15:12:37.717000             🧑  作者: Mango

门| GATE CS 2021 |设置 1 |问题 29

此题是 GATE CS 2021 计算机科学门类设置1中的第29题。

题目描述

让我们定义一个 $n$ 个元素的数列 $a$ 是“良构的”,如果序列 $a$ 中的每个元素都是从 $1$ 到 $n$ 的整数,且满足以下条件:

  1. $a$ 顺序包含从 $1$ 到 $n$ 的所有整数。
  2. 对于 $1≤i≤n$,元素 $i$ 在序列 $a$ 中的位置不大于 $2i-1$。

现在,假设存在一个数组 $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