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;
}