1 条题解

  • 0
    @ 2025-10-16 20:12:30

    题目理解

    这是一个 N×NN \times N 的棋盘,每行每列恰好有一个障碍,并且障碍不在同一行同一列(即障碍构成一个排列)。
    我们要在剩下的 N×NN=N(N1)N \times N - N = N(N-1) 个可用格子里,放置 NN 个棋子,使得:

    1. 每行恰好一个棋子
    2. 每列恰好一个棋子
    3. 不能放在障碍上

    等价于:在 N×NN \times N 的矩阵中,去掉 NN 个障碍(每行一个,每列一个),在剩下的位置中找出所有 N×NN \times N 的排列矩阵(每行每列一个棋子)。


    转化

    设障碍在第 ii 行的位置是 bib_i(列下标)。
    那么问题变成:在 1N1 \dots N 的全排列中,有多少个排列 PP 满足 PibiP_i \neq b_i 对所有 ii 成立。

    这就是错排问题(Derangement):排列中每个位置 ii 上的数都不能是 bib_i
    但是注意,这里的 bib_i 不一定是 ii,而是任意一个 1N1 \dots N 的排列。


    进一步转化

    因为 b1,b2,,bNb_1, b_2, \dots, b_N1N1 \dots N 的一个排列,我们可以通过重新标记列号,把问题变成标准的错排问题:

    定义映射:设障碍位置在第 ii 行第 bib_i 列,我们想要一个排列 PP 使得 PibiP_i \neq b_i
    我们可以把列重新编号,使得 bi=ib_i = i(即障碍在 (i,i)(i,i) 位置)。这样问题就变成:求排列 PP 满足 PiiP_i \neq i 的个数,这就是错排数 DND_N


    错排公式

    错排数递推公式:

    $$D_n = (n-1)(D_{n-1} + D_{n-2}), \quad D_1 = 0, \ D_2 = 1 $$

    或者通项:

    Dn=n!k=0n(1)kk!D_n = n! \sum_{k=0}^{n} \frac{(-1)^k}{k!}

    结论

    无论障碍的排列是什么,只要每行每列一个障碍,方案数就是 NN 的错排数 DND_N

    验证样例: N=2N=2,错排数 D2=1D_2 = 1,与样例输出一致。

    • 1

    信息

    ID
    3208
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者