F_JustWei's Studio.

5762. 恰有 K 根木棍可以看到的排列数目

字数统计: 424阅读时长: 1 min
2021/05/16 Share

5762. 恰有 K 根木棍可以看到的排列数目

n 根长度互不相同的木棍,长度为从 1n 的整数。请你将这些木棍排成一排,并满足从左侧 可以看到 恰好 k 根木棍。从左侧 可以看到 木棍的前提是这个木棍的 左侧 不存在比它 更长的 木棍。

  • 例如,如果木棍排列为 [***1***,***3***,2,***5***,4] ,那么从左侧可以看到的就是长度分别为 135 的木棍。

给你 nk ,返回符合题目要求的排列 数目 。由于答案可能很大,请返回对 109 + 7 取余 的结果。

示例 1:

1
2
3
4
输入:n = 3, k = 2
输出:3
解释:[1,3,2], [2,3,1] 和 [2,1,3] 是仅有的能满足恰好 2 根木棍可以看到的排列。
可以看到的木棍已经用粗体+斜体标识。

示例 2:

1
2
3
4
输入:n = 5, k = 5
输出:1
解释:[1,2,3,4,5] 是唯一一种能满足全部 5 根木棍可以看到的排列。
可以看到的木棍已经用粗体+斜体标识。

示例 3:

1
2
3
输入:n = 20, k = 11
输出:647427950
解释:总共有 647427950 (mod 109 + 7) 种能满足恰好有 11 根木棍可以看到的排列。

提示:

  • 1 <= n <= 1000
  • 1 <= k <= n

思路:

第一类斯特林数

C++代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
private:
using LL = long long;
const int MOD = 1e9 + 7;
int s[1010][1010];
public:
int rearrangeSticks(int n, int k) {
s[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
s[i][j] = (s[i - 1][j - 1] + (LL)(i - 1) * s[i - 1][j]) % MOD;
return s[n][k];
}
};
CATALOG
  1. 1. 5762. 恰有 K 根木棍可以看到的排列数目
    1. 1.0.1. 示例 1:
    2. 1.0.2. 示例 2:
    3. 1.0.3. 示例 3:
    4. 1.0.4. 提示:
    5. 1.0.5. 思路:
    6. 1.0.6. C++代码: