首页 > 其他 > 详细

「题解」「HDU4349」Xiao Ming's Hope

时间:2020-04-22 21:58:53      阅读:55      评论:0      收藏:0      [点我收藏+]

题目

给你一个数 \(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;
}

「题解」「HDU4349」Xiao Ming's Hope

原文:https://www.cnblogs.com/Arextre/p/12755756.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!