输入一个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;
}