Description–
解题思路–
设 f [ n ] f[n] f[n] 为 n n n 个数的合法排列个数
- 第n个数可以放在(n-1)个位置,我们称放的位置为k
- 考虑第k个数
1 放在位置n上,那么剩下的n-2个数的排列个数为f[n-2]
2 不放在位置n,那么除n以外的排列个数为f[n-1]
所以, f [ n ] = ( n − 1 ) ( f [ n − 1 ] + f [ n − 2 ] ) , n ≤ 3 f[n] = (n - 1)(f[n-1]+f[n-2]),n \leq 3 f[n]=(n−1)(f[n−1]+f[n−2]),n≤3
代码–
#include <iostream>
#include <cstdio>
using namespace std;
long long n, f[25];
int main()
{
scanf("%lld", &n);
f[1] = 0, f[2] = 1;
for (long long i = 3; i <= n; ++i)
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
printf("%lld", f[n]);
return 0;
}