hdu2068 错排+组合

来源:互联网 发布:网络代购是怎么挣钱 编辑:程序博客网 时间:2024/05/21 00:44

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068

题意:有n个人,野骆驼(人名)只要认识一半以上就可以了。请问有多上组答案能使他过关。

思路:必须认识一半以上,也就是说他最多有一半个不认识的。所以是0~n/2的每一个错排产生的答案都满足题意。选取i(i=0,1,2,……,n/2)个人进行错排,由乘法原理可知

产生的答案组数为:C_n_m(n,i)*a[i];其中a[i]是错排数,把它们加起来就是所有的可以使他过关的答案数。

代码如下:

#include<stdio.h>_int64 C_n_m(int n,int m){    int i;    _int64 x=1,y=1;    for(i=1;i<=m;i++)        x*=i;    for(i=n;i>n-m;i--)        y*=i;    return y/x;}int main(){    int i,n;    _int64 sum,a[14]={1,0,1,2};    for(i=4;i<14;i++)        a[i]=(i-1)*(a[i-1]+a[i-2]);    while(scanf("%d",&n),n)    {        for(sum=0,i=0;i<=n/2;i++)            sum+=C_n_m(n,i)*a[i];        printf("%I64d\n",sum);    }    return 0;}


原创粉丝点击