HDU2068RPG的错排(组合+错排)

题目链接:传送门
分析:运用错排原理,大概是答对一半以及以上就是可以全对,也可以错一个,或者错两个,错三个,直到错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

猜你喜欢

转载自blog.csdn.net/weixin_43556295/article/details/86689327
今日推荐