「题解」「HDU4349」Xiao Ming's Hope
题目
给你一个数 \(n\),让你求 \(C(n,0)、C(n,1)...C(n,n)\) 这 \(n+1\) 个数中为奇数的个数。
题解
由 \(\text{Lucas}\) 定理可得
\[C(n,m)≡C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[n-2])*...C(a[0]*b[0])\pmod p
\]
由于我们计算 \(C(n,m)\) 的奇偶性,那么我们取这里的 \(p=2\)。
因为我们是取模 \(2\),所以所有的 \(a[i],b[i]\) 的取值只有可能是 \(0,1\),进而可得所有的 \(C(a[i],b[i])\) 取值只有可能是 \(0,1\)。
如果我们要让 \(C(n,m)\) 为偶数,那么后面的所有 \(C(a[i],b[i])\) 绝对不能出现 \(0\),考虑怎么样才能让 \(C(n,m)\) 为 \(1\):
- 如果 \(n\) 的二进制形式第 \(i\) 位为 \(0\) 即 \(a[i]=0\),那么只有当 \(m\) 的二进制这一位为 \(0\),即 \(b[i]=0\)。
- 如果 \(n\) 的二进制形式第 \(i\) 位为 \(1\) 即 \(a[i]=1\),那么 \(m\) 的二进制这一位为 \(0,1\) 都可以,有两种取值
那么,我们只需要统计第二种情况的出现次数 \(ocnt\),租后答案就是 \(2^{ocnt}\)。
也就是统计 \(n\) 的二进制表示有多少个 \(1\)。
#include<cstdio>
#include<cmath>
int n,ocnt;
signed main(){
while(~scanf("%d",&n)){ocnt=0;
for(;n>0;n>>=1)if(n&1)++ocnt;
printf("%d\n",1<<ocnt);
}
return 0;
}