HDU4349--Xiao Ming's Hope(数论)

输入一个n(1<=n<=108),求C(n,0),C(n,1),C(n,2)...C(n,n)有多少个奇数。

Lacus定理 http://blog.csdn.net/acm_cxlove/article/details/7844973

A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。

则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同

所以此题中 C(n, x) 将n和x化成2进制 C(0,0)=1,C(0,1)=0,C(1,0)=1,C(1,1)=1

所以如果C(n,x)为1,那么n为0的位置x必为0,n为1的位置x为0或1

答案为2^(n的二进制表示1的个数)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
    int n, c;
    while (~scanf("%d", &n)) {
        c = 0;
        while (n) {
            if (n & 1) ++c;
            n >>= 1;
        }
        printf("%d\n", (int)pow(2, c));
    }
    return 0;
}

  

posted @ 2016-01-21 15:40  我不吃饼干呀  阅读(191)  评论(0编辑  收藏  举报