题目
上周周赛结束了,每个同学都有一个排名,且不存在并列情况
zks在统计协会周赛排名的时候,意外的将一部分同学排名统计错了。
请问,zks将所有同学排名都统计错误的情况有多少种?
输入样例
3
输出样例
2
提示
n=3时,有两种情况:
3 1 2
2 3 1
思路
为了做出这道题,我特意去百度了错排,错排数即一组元素中所有元素都不在原来位置上的情况数量,设n个数的错排数为D(n),则满足D(n)=(n-1)*[D(n-1)+D(n-2)]。本题可使用错排公式解决。
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
typedef long long ll;
using namespace std;
ll D(ll n){
if(n==1) return 0;//当n=1时排错的情况为0
if(n==2) return 1;//当n=2时排错的情况为1
return (n-1)*(D(n-1)+D(n-2));//利用递归实现错排
}
ll n,ans;
int main()
{
scanf("%lld",&n);
ans=D(n);
printf("%lld\n",ans);
return 0;
}