思路
首先设
f
[
n
]
f[n]
f[n] 表示n个数的满足题意的方案数
首先,设一个
k
k
k 号位置,如果我们将
n
n
n 放在k号位置
(
k
≠
n
)
(k≠n)
(k=n),那么有
(
n
−
1
)
(n-1)
(n−1) 种放法
其次,我们🤔考虑
k
k
k 的放置。
-
k
k
k 放在
n
n
n 的位置:
这样放的话剩下的无序的元素就还剩 ( n − 2 ) (n-2) (n−2) 个,
相当于把那 ( n − 2 ) (n-2) (n−2) 个元素错排,方案数是 f [ n − 2 ] f[n-2] f[n−2]. -
k
k
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)\times{(f[n-1]+f[n-2])}
(n−1)×(f[n−1]+f[n−2]) .
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n,f[21];
int main()
{
cin>>n;
f[1]=0,f[2]=1;
for(int i=3; i<=n; i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
cout<<f[n];
return 0;
}