博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第12届北师大校赛热身赛第二场 C. 组合数
阅读量:6435 次
发布时间:2019-06-23

本文共 2430 字,大约阅读时间需要 8 分钟。

题目链接:http://www.bnuoj.com/bnuoj/contest_show.php?cid=3570#problem/43573

C. 组合数

Time Limit: 1000ms
Case Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: 
%lld      Java class name: 
Main
 
Font Size: 
+  
-

 对于给定的n和k,求它们的组合数C(n, k)的奇偶性

Input

 多组输入。每组输入包括两个整数n,k(1<=k<=n<=10^8)。输入以EOF结束。

Output

 对于每组输入,输出一个数表示C(n, k)的奇偶性,0表示偶数,1表示奇数

Sample Input

1 02 13 2

Sample Output

101

数论问题:对组合数,若n&k==k则为奇数,否则则为偶数。

证明例如以下:

公式P是指排列,从N个元素取R个进行排列(即排序)。 (P是旧使用方法,如今教材上多用A,Arrangement)  公式C是指组合,从N个元素取R个,不进行排列(即不排序)。的判定方法为:  结论:  对于C(n,k),若n&k == k 则c(n,k)为奇数,否则为偶数。  证明:  利用:  由C(n,k) = C(n,k-1) + C(n-1,k-1);  相应于:  1  1 2 1  1 3 3 1  1 4 6 4 1  ………………  能够验证前面几层及k = 0时满足结论,以下证明在C(n-1,k)和C(n-1,k-1) (k > 0) 满足结论的情况下,  C(n,k)满足结论。  1).如果C(n-1,k)和C(n-1,k-1)为奇数:  则有:(n-1)&k == k;  (n-1)&(k-1) == k-1;  由于k和k-1的最后一位(在这里的位指的是二进制的位,下同)必定是不同的,所以n-1的最后一位必定是1  。  现如果n&k == k。  则相同由于n-1和n的最后一位不同推出k的最后一位是1。  由于n-1的最后一位是1,则n的最后一位是0,所以n&k != k,与如果矛盾。  所以得n&k != k。  2).如果C(n-1,k)和C(n-1,k-1)为偶数:  则有:(n-1)&k != k;  (n-1)&(k-1) != k-1;  现如果n&k == k.  则对于k最后一位为1的情况:  此时n最后一位也为1,所以有(n-1)&(k-1) == k-1,与如果矛盾。  而对于k最后一位为0的情况:  则k的末尾必有一部如:10; 代表随意个0。  相应的,n相应的部分为: 1{*}*; *代表0或1。  而若n相应的{*}*中仅仅要有一个为1,则(n-1)&k == k成立,所以n相应部分也应该是10。  则相应的,k-1和n-1的末尾部分均为01,所以(n-1)&(k-1) == k-1 成立,与如果矛盾。  所以得n&k != k。  由1)和2)得出当C(n,k)是偶数时,n&k != k。  3).如果C(n-1,k)为奇数而C(n-1,k-1)为偶数:  则有:(n-1)&k == k;  (n-1)&(k-1) != k-1;  显然,k的最后一位仅仅能是0,否则由(n-1)&k == k就可以推出(n-1)&(k-1) == k-1。  所以k的末尾必有一部如:10;  相应的,n-1的相应部分为: 1{*}*;  相应的,k-1的相应部分为: 01;  则若要使得(n-1)&(k-1) != k-1 则要求n-1相应的{*}*中至少有一个是0.  所以n的相应部分也就为 : 1{*}*; (不会由于进位变1为0)  所以 n&k = k。  4).如果C(n-1,k)为偶数而C(n-1,k-1)为奇数:  则有:(n-1)&k != k;  (n-1)&(k-1) == k-1;  分两种情况:  当k-1的最后一位为0时:  则k-1的末尾必有一部如: 10;  相应的,k的相应部分为 : 11;  相应的,n-1的相应部分为 : 1{*}0; (若为1{*}1,则(n-1)&k == k)  相应的,n的相应部分为 : 1{*}1;  所以n&k = k。  当k-1的最后一位为1时:  则k-1的末尾必有一部分形如: 01; (前面的0能够是附加上去的)  相应的,k的相应部分为 : 10;  相应的,n-1的相应部分为 : 01; (若为11,则(n-1)&k == k)  相应的,n的相应部分为 : 10;  所以n&k = k。  由3),4)得出当C(n,k)为奇数时,n&k = k。  综上,结论得证!
证明出自:http://zhidao.baidu.com/link?url=FTCA2X8YsPRIMW7_eiGNnxELJIL4ymgvosNXk0VEA5LbXDNnuxirzBmqtiLjKbG2e9IpXlKpR2jF6fKPSlOL6_

附上代码:

#include
#include
#include
#include
using namespace std;int main(){ int n,k; while(cin>>n>>k) { long t=n&k; if(t==k) { printf("1\n"); } else { printf("0\n"); } } return 0;}

转载地址:http://xtqga.baihongyu.com/

你可能感兴趣的文章
使用 husky 和 lint-staged 检查 Node.js 的代码一致性
查看>>
【Laravel-海贼王系列】第十三章,路由&控制器解析
查看>>
手把手讲解 Android Hook入门Demo
查看>>
Java开源诊断工具 Arthas 发布v3.1.0
查看>>
什么是以太坊
查看>>
高效开发者是如何个性化VS Code插件与配置的?
查看>>
Java日志那些事
查看>>
XSS和CSRF详解与防御
查看>>
使用Heroku,解决gitment登录失败,报[object ProgressEvent]的错
查看>>
117. Populating Next Right Pointers in Each Node II
查看>>
【笔记】重学前端-winter
查看>>
大数据构建模块:选择体系结构和开源框架
查看>>
62. Unique Paths
查看>>
告诉你微信域名被封的原因和防封方案
查看>>
七个你没用过的炫酷开发工具推荐
查看>>
深度解析利用ES6进行Promise封装总结
查看>>
css的content属性
查看>>
熬过了互联网“寒冬”,接下来的金三银四你该怎么面试进BAT?
查看>>
Java 开源库精选(持续更新)
查看>>
Google发布用于Google Cloud的.Net API
查看>>