题目
题解思路
找错的人一定小于人数的一半,总人数总选出这些人用组合C,两个相乘就是答案了。然后再累加出总数即可。
错排公式
cu[i] = cu[i-1]*(i-1) + cu[i-2] ;
下面代码我不知道为何WA,我认为是对的,而且两个编译器不同的答案真是离谱。。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define ll __int64
ll cu[21];
ll zuhe (int a,int b)
{
ll zi = 1,mu = 1;
a = min (a,b-a);
int i = a;
while(i)
{
zi *= b;
mu *= a;
a--;
b--;
i--;
}
return zi/mu;
}
int main()
{
cu[0] = 1;
cu[1] = 0;
cu[2] = 1;
for (int i = 3 ; i <= 20 ; i++)
cu[i] = cu[i-1]*(i-1) + cu[i-2] ;
int t;
while(cin>>t && t)
{
ll ans = 0;
for(int i = 0 ;i <= t/2 ; i++)
{
ans += cu[i]*zuhe(i,t);
}
cout<<ans<<"\n";
}
return 0;
}