思路:
我们考虑一个k,使它不在原来的位置上,那么就有n-1种可能
让后继续考虑,如果那个k放在了n的位置上,那么方案就是剩下n-2个元素错排,就是f[n-2]
如果k不在n的位置上,那么就是n-1个元素错排,就是f[n-1]
最后所求为
(
n
−
1
)
∗
(
f
[
n
−
1
]
+
f
[
n
−
2
]
)
(n-1)*(f[n-1]+f[n-2])
(n−1)∗(f[n−1]+f[n−2])
code:
#include<iostream>
#include<cstdio>
using namespace std;
long long n, f[1000];
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;
}