解题思路
首先设 f [ n ] f[n] f[n] 表示 n n n个数的满足题意的方案数。
首先,设一个k 号位置,如果我们将 n 放在k号位置 ( k ≠ n ) ( k ≠ n ) (k=n) ,那么有 ( n − 1 ) ( n − 1 ) (n−1) 种放法其次,我们考虑 k 的放置。
- k 放在 n 的位置:
这样放的话剩下的无序的元素就还剩 ( n − 2 ) ( n − 2 ) (n−2) 个,
相当于把那 ( n − 2 ) ( n − 2 ) (n−2) 个元素错排,方案数是 $f [ n − 2 ] $. - k 不放在n的位置:
这样的话无序的元素就有 ( n − 1 ) ( n − 1 ) (n−1) 个,
相当于把 ( n − 1 ) ( n − 1 ) (n−1) 个元素错排,方案数是 f [ n − 1 ] f [ n − 1 ] f[n−1] .
所以在 ( n − 1 ) ( n − 1 ) (n−1) 的情况下就有 f [ n − 1 ] + f [ n − 2 ] f [ n − 1 ] + f [ n − 2 ] f[n−1]+f[n−2]种放法。
总方案数就是 ( n − 1 ) × ( f [ n − 1 ] + f [ n − 2 ] ) ( n − 1 ) × ( f [ n − 1 ] + f [ n − 2 ] ) (n−1)×(f[n−1]+f[n−2]) .
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
long long n,f[110];
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]);
}