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; }