题目描述
求一个有 n n n个数的排列 A A A,使得 A [ i ] A[i] A[i]不等于 i i i
输入格式
一个整数
输出格式
一个整数,表示答案
输入样例
3
1
输出样例
2
解题思路
我们设一个
f
(
n
)
f(n)
f(n)表示
n
n
n个数的合法排列个数
先考虑第
n
n
n个元素,把他放在位置
m
m
m上,那么就有
n
−
1
n-1
n−1种放法
然后就要考虑一下第
m
m
m个元素了
第一种情况:把第
m
m
m个元素放在位置
n
n
n,那么由于第
k
k
k个元素放在了位置
n
n
n,所以剩下的
n
−
2
n-2
n−2个元素错排就可以了
☝☝☝☝☝☝☝☝☝☝☝☝☝☝
第一种共有
f
(
n
−
2
)
f(n-2)
f(n−2)种放法
第二种情况:因为第一种就已经把第
m
m
m个元素放在位置
n
n
n上了,所以第二种就是不把第
m
m
m个元素放在位置
n
n
n上了,那么就有
n
−
1
n-1
n−1个元素的错排了
☝☝☝☝☝☝☝☝☝☝☝☝☝☝
第二种共有
f
(
n
−
1
)
f(n-1)
f(n−1)种放法
程序如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n, f[100001];
int main()
{
scanf("%lld",&n);
f[1] = 0;
f[2] = 1;
for(int i = 3; i <= n; ++i)
f[i] = (i - 1) * (f[i - 2] + f[i - 1]);
printf("%lld",f[n]);
return 0;
}