1 条题解
-
0
题目理解
这是一个 的棋盘,每行每列恰好有一个障碍,并且障碍不在同一行同一列(即障碍构成一个排列)。
我们要在剩下的 个可用格子里,放置 个棋子,使得:- 每行恰好一个棋子
- 每列恰好一个棋子
- 不能放在障碍上
等价于:在 的矩阵中,去掉 个障碍(每行一个,每列一个),在剩下的位置中找出所有 的排列矩阵(每行每列一个棋子)。
转化
设障碍在第 行的位置是 (列下标)。
那么问题变成:在 的全排列中,有多少个排列 满足 对所有 成立。这就是错排问题(Derangement):排列中每个位置 上的数都不能是 。
但是注意,这里的 不一定是 ,而是任意一个 的排列。
进一步转化
因为 是 的一个排列,我们可以通过重新标记列号,把问题变成标准的错排问题:
定义映射:设障碍位置在第 行第 列,我们想要一个排列 使得 。
我们可以把列重新编号,使得 (即障碍在 位置)。这样问题就变成:求排列 满足 的个数,这就是错排数 。
错排公式
错排数递推公式:
$$D_n = (n-1)(D_{n-1} + D_{n-2}), \quad D_1 = 0, \ D_2 = 1 $$或者通项:
结论
无论障碍的排列是什么,只要每行每列一个障碍,方案数就是 的错排数 。
验证样例: ,错排数 ,与样例输出一致。
- 1
信息
- ID
- 3208
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者