P1595 信封问题
题目描述
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。
输入格式
一个信封数n(n<=20)
输出格式
一个整数,代表有多少种情况。
输入输出样例
输入 #1
2
输出 #1
1
输入 #2
3
输出 #2
2
我的思路
这题是一个数论问题,运用数学知识很容易解出。
全错位排序递推公式:f[n] = (n - 1)*(f[n-1] + f[n-2])
此题需要注意的是数据范围是long long, 而不是int
小编就因为这个没AC
我的代码
#include<bits/stdc++.h>
using namespace std;
long long f[21] = {1, 0, 1, 2}, n;
int main() {
cin >> n;
if (n <= 3) {
cout << f[n];
return 0;
}
for (int i = 4; i <= n; i++)
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
cout << f[n];
return 0;
}