1 条题解

  • 0
    @ 2025-8-24 21:46:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar YoungNeal
    **

    搬运于2025-08-24 21:46:12,当前版本为作者最后更新于2018-02-28 19:48:57,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    如果知道了错排问题,那这就是一个裸的高精。
    原博客戳这里 YoungNeal

    Description

    给你一个 NNN*N 的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放 NN 枚棋子(障碍的位置不能放棋子),要求你放 NN 个棋子也满足每行只有一枚棋子,每列只有一枚棋子的限制,求有多少种方案。

    Solution

    我们先来科普一下错排问题。

    错排问题指考虑一个有 nn 个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 nn 个元素的错排数记为 D(n)D(n) 。 研究一个排列错排个数的问题,叫做错排问题或称为更列问题。 ---《百度百科》

    看上去这就是一个递推问题,那么递推式是如何推出来呢? 当 nn 个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用 D(n)D(n) 表示,那么 D(n1)D(n-1) 就表示 n1n-1 个编号元素放在 n1n-1 个编号位置,各不对应的方法数,其它类推.
    第一步,把第 nn 个元素放在一个位置,比如位置 kk ,一共有 n1n-1 种方法;
    第二步,放编号为 kk 的元素,这时有两种情况:⑴把它放到位置 nn ,那么,对于剩下的 n1n-1 个元素,由于第 kk 个元素放到了位置 nn ,剩下 n2n-2 个元素就有 D(n2)D(n-2) 种方法;⑵第 kk 个元素不把它放到位置 nn ,这时,对于这 n1n-1 个元素,有 D(n1)D(n-1) 种方法;
    综上得到
    D(n)=(n1)(D(n2)+D(n1))D(n) = (n-1) *(D(n-2) + D(n-1))
    特殊地,D(1)=0,D(2)=1D(1) = 0, D(2) = 1.

    知道了这个之后,这题就是一个裸的高精了。

    // By YoungNeal
    #include<cstdio>
    using namespace std;
    // D(n)=(n-1)*(D(n-1)+D(n-2))
    // D(1)=0 D(2)=1
    
    int n;
    int D[205][100005];
    
    void ad(int now){
        int x=0;
        for(int i=1;i<100005;i++){
            D[now][i]=D[now-1][i]+D[now-2][i]+x;
            x=D[now][i]/10;
            D[now][i]%=10;
        }
        x=0;
        for(int i=1;i<100005;i++){
            D[now][i]=D[now][i]*(now-1)+x;
            x=D[now][i]/10;
            D[now][i]%=10;
        }
    }
    
    signed main(){
        scanf("%d",&n);
        D[2][1]=1;
        if(n==1||n==2){
            printf("%d",n-1);
            return 0;
        }
        for(int i=3;i<=n;i++)
            ad(i);
        int lenc=100004;
        while(D[n][lenc]==0) lenc--;
        while(lenc) printf("%d",D[n][lenc--]);
        return 0;
    } 
    
    • 1

    信息

    ID
    2255
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者