题目链接:传送门
分析:运用错排原理,大概是答对一半以及以上就是可以全对,也可以错一个,或者错两个,错三个,直到错n/2个人,总数加起来就是就是他要猜对一半的个数
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long C_n_m(int n,int m)
{
long long up,down;
int i;
up=down=1;
if(m==0) return 1;
if(m>n/2) m=n-m;
for(i=0;i<m;i++)
{
up=up*(n-i);
down=down*(i+1);
}
return up/down;
}
int main()
{
int n,i;
long long sum;
long long f[16]={0,0,1,2};
for(i=4;i<14;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
while(scanf("%d",&n),n)
{
sum=1;
for(i=1;i<=n/2;i++)
{
sum+=f[i]*C_n_m(n,i);
}
printf("%I64d\n",sum);
}
}
小结:题目很经典,注意一下阶乘数可能过大用个Long long