解题思路
设 f i f_i fi为 i i i个数错排的方案
将 n n n放在第 k k k位上,有 ( n − 1 ) (n - 1) (n−1)种方案
- 如果将 k k k放在第 n n n位上,剩下的 n − 2 n-2 n−2个数错排,那么就有 f i − 2 f_{i-2} fi−2种方案
- 如果不把 k k k放在第 n n n位上,剩下 n − 1 n-1 n−1个数错排, f i − 1 f_{i-1} fi−1
Code
#include <iostream>
#include <cstdio>
using namespace std;
long long n, f[30];
int main(){
scanf ("%lld", &n);
f[2] = 1;
for (int i = 3; i <= n; i++)
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
printf ("%lld", f[n]);
}