【ybtoj 高效进阶1.1】【递推】错排问题
解题思路
设f[n]为n个数的错排个数
假设有n个数
第n个数放在第k(1~n-1)位上
1.k放在第n位上,那么还剩n-2个数错排,那么这种情况下,有(n-1)* f[n-2] 种
2.k不放在第n位上,那么剩下n-1(包括k)个数错排(因为k不能放在第n位),那么有(n-1)* f[n-1]
所以f[n]为(n-1)* (f[n-1]+f[n-2])
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n,f[30];
int main()
{
scanf("%lld",&n);
f[1]=0,f[2]=1;
for (int i=3;i<=n;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
printf("%lld",f[n]);
return 0;
}