东方博宜OJ 1694:装信封问题 ← 递归

【题目来源】
https://oj.czos.cn/p/1694

【题目描述】
某人写了 N 封信,用去 N 个信封,结果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。可用下面公式(错位排列的递推公式):
基本形式:D(1)=0;D(2)=1
递归形式:D(n)=(n-1)*(D(n-1)+D(n-2))

【输入格式】
一个正整数 N,N<13。​​​​​​​

【输出格式】
所有的信都装错信封的不同情况数。

【输入样例】
1

【输出样例】
0

【数据范围】
N<13​​​​​​​

【算法分析】
● 错排列递归形式:D(n)=(n-1)*(D(n-1)+D(n-2))​​​​​​​。其中,D(1)=0,D(2)=1。
● 利用错排列递归形式,此题可瞬秒。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

int d(int n) {
    if(n==1) return 0;
    if(n==2) return 1;
    return (n-1)*(d(n-1)+d(n-2));
}

int main() {
    int n;
    cin>>n;
    cout<<d(n);

    return 0;
}

/*
in:1
out:0
*/





【参考文献】
https://oj.czos.cn/p/1694
https://blog.csdn.net/hnjzsyjyj/article/details/156204715




 

posted @ 2025-12-23 22:51  Triwa  阅读(0)  评论(0)    收藏  举报