「题解」「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;
}
posted @ 2020-04-22 20:45  Arextre  阅读(85)  评论(0编辑  收藏  举报