错排问题
题目描述
输入格式
一行整数n
输出格式
一个整数,表示答案
输入样例
2
输出样例
1
解题思路
这道题是一道递推,我们先来求递推式:
设
f
(
n
)
f(n)
f(n)表示n个数的合法排列个数
第一步,我们先考虑第n个元素,将其放在位置k上,一共有n-1中放法
(
k
≠
n
)
(k≠n)
(k=n)
第二步,考虑第k个元素,这时候有两种可能:
(1)把第k个元素放在位置n,那么对于除n外的n-1个元素,由于第k个元素放在了位置n,所以剩下n-2个元素的错排,有f(n-2)种放法。
(2)不把第k个元素放在位置n,此时对于n-1个元素的错排,有f(n-1)种方法。
故有递推式:
f
(
n
)
=
(
n
−
1
)
(
f
(
n
−
1
)
+
f
(
n
−
2
)
)
f(n)=(n-1)(f(n-1)+f(n-2))
f(n)=(n−1)(f(n−1)+f(n−2))
(
n
>
=
3
)
(n>=3)
(n>=3)
其中f(1)=0,f(2)=1。
代码
#include<iostream>
using namespace std;
long long a[30]; 注意要用long long
int main()
{
int i,n;
cin>>n;
a[1]=0;
a[2]=1;
for(i=3;i<=n;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);
cout<<a[n];
return 0;
}