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

东方博宜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