判断组合数的奇偶性
由卢卡斯定理可得 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