【基础练习】【组合数奇偶判定】愚蠢的随机数

题目来源 codevs 1504 洛谷 P1869

判断组合数奇偶性

#include<cstdio>  
int n,k,tot;  
int main()  
{  
    scanf("%d",&tot);  
    for (int i=1;i<=tot;++i)  
    {  
        scanf("%d%d",&n,&k);  
        if ((n&k)==k) printf("%d\n",1);  
        else printf("%d\n",0);  
    }  
    return 0;  
}  

这个程序原本有一个严重问题:按位与运算没有加括号

如果n&k==k那么是奇数 否则是偶数 

判定方法来自百度,可是我至今都没看懂 请高手作简明易懂的解释

组合数的奇偶性判定方法为:

公式P是指排列,从N个元素取R个进行排列(即排序)。 (P是旧用法,现在教材上多用AArrangement)

  公式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;

  由于kk-1的最后一位(在这里的位指的是二进制的位,下同)必然是不同的,所以n-1的最后一位必然是1

  现假设n&k == k

  则同样因为n-1n的最后一位不同推出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{*}*; *代表01

  而若n对应的{*}*中只要有一个为1,则(n-1)&k == k成立,所以n对应部分也应该是10

  则相应的,k-1n-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{*}*; (不会因为进位变10)

  所以 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

  综上,结论得证!

n&kn(按位与)k的意思,比如说n=9,k=3,那么转化成二进制n=1001,k=0011,进行运算(都是1则为1,否则为0)后得到1,如果它和k相等,组合数则为奇数,否则为偶数,至于其中的道理是:根据二进制的运算法则,从后向前数,有几个0(不能有间断),就有几个偶数因子(这里就说是以2为因子吧),按位与的功能就是消0,当然根据组合公式,分子上的偶数因子不可能比分母上的少,但是如果相等的话,那么这个数就是一个奇数了,按位与的功能是01在一块就消1,那么如果想保留原有的k值,n转化成二进制后就要有许多个1(通俗一点),这样的话,他的偶数因子也会减少,经过证明,可以得到当n&k==k时,n!k!(n-k)!的偶数因子一样多,就可以把它们消去,从而得到一个奇数。


        ——东之羲和能走马,海尘新生石山下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值