判断组合数的奇偶性

由卢卡斯定理可得 C(n,m)%2 = C(n/2,m/2) * C(n%2,m%2)% 2 (除法均为向下取整,且当m==0的时候不能再继续递归)

C(1,1) = C(1,0) = C(0,0) = 1 C(0,1) = 0 C(X,0)=1

所以最终经过递归一定会得到 C(X,0) * kC(1,1) * kC(1,0) * kC(0,0) * kC(0,1) (k>=0)

如果 C(0,1)存在,即 kC(0,1) 中 k>0,那么显然最后结果一定为 0

否则 最后结果将为 1

而n%2 m%2 实质上就是取出 n,m二进制形式的最后一位数字

于是 如果 C(0,1)存在,那么在n,m 中的某一对应的位上,一定满足 n==0, m==1,此时 n&m!= m

如果 C(0,1)不存在,那么在n,m 中的任何对应的位上,都不满足 n==0, m==1,此时 n&m == m

于是 当 n&m!= m 时,C(n,m)为偶数

当 n&m == m 时,C(n,m)为奇数

应用例题: HDU4349

链接: http://acm.hdu.edu.cn/showproblem.php?pid=4349

 

#include<iostream>
#include<cstdio>
using namespace std;
 
int main() {
	unsigned long long n,ans;
	while (~scanf("%lld", &n)) {
		ans = 0;
		while (n) {
			if(n & 1)
				ans++;
			n >>= 1;
		}
		long long a=1;
		for(int i=1; i<=ans; i++)a*=2;
		printf("%lld\n", a);
	}
	return 0;
}

  


版权声明:本文为CSDN博主「StarrYooSkY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/StarrYooSkY/article/details/86554729

posted @ 2022-10-05 21:05  我微笑不代表我快乐  阅读(113)  评论(0编辑  收藏  举报