题目描述
某人写了n封信和n个信封,如果所有的信都装错了信封,共有多少种不同情况?
输入输出格式
输入格式
一行,一个整数n(n≤10)。
输出格式
一行,为所有的情况数。
输入输出样例
输入样例
4
输出样例
9
题解
现在假设有$i$封信需要处理。
当第$i$封信放在$[1,i)$中的第$j$个信封时,如果第$j$封信放到了第$i$个信封中,我们其实可以把当前情况下的情况数看做只有$(i-2)$封信的情况数。
但如果第$j$封信放在了$[1,i)$中的第$k$个信封时,其实我们可以把第$i$个信封看做第$j$个信封,忽略实际已放了第$i$封信的第$j$个信封,这样我们就可以把当前的情况数看做只有$(i-1)$封信的情况数。
这样就可以得到递推式:$a[i]=(i-1) imes(a[i-1]+a[i-2])$。
#include <iostream> using namespace std; int n; int a[11] = {0,0,1,2}; int main() { cin >> n; for(int i = 4; i <= n; i++) { a[i] = (i - 1) * (a[i - 1] + a[i - 2]); } cout << a[n]; return 0; }