这样想,错排n位时,先把其中一位错排,假设把一个数k放在第一位,那么有n-1种放法,然后1可以随意放置,但是有两种情况。1:1放在了第k位,也就是1和k交换了,那么剩下的直接错排有F(n-2)种方法;2:1不放在第k位,此时相当于F(n-1)(这个我没想懂)。所以递推公式就是F(n)=(n-1)*(F(n-1)+F(n-2))。
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <list>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
long long int ans[22];
int main()
{
ans[2]=1;
ans[3]=2;
for(int i=4;i<=20;i++)
ans[i]=(i-1)*(ans[i-1]+ans[i-2]);
int x;
while(scanf("%d",&x)!=EOF) printf("%lld\n",ans[x]);
return 0;
}