• poj3219--二项式系数--组合数的奇偶性


    Description

    二项式系数C(nk)因它在组合数学中的重要性而被广泛地研究。二项式系数可以如下递归的定义:

    C(1, 0) = C(1, 1) = 1;
    C(n, 0) = 1对于所有n > 0;
    C(nk) = C(n − 1, k − 1) + C(n − 1, k)对于所有0 < k ≤ n

    给出nk,你要确定C(nk)的奇偶性。

    Input

    输入包含多组测试数据。每组测试数据一对整数nk(0 ≤ k ≤ n < 231),占据独立一行。

    文件结束符(EOF)表示输入结束。

    Output

    对每组测试数据,输出一行,包含一个“0” 或一个“1”,即C(nk)除以2的余数。

    Sample Input

    1 1
    1 0
    2 1

    Sample Output

    1
    1
    0

    题解:

      对于C(n,k),若n&k == k 则c(n,k)为奇数,否则为偶数。

      证明转载自:http://wenda.tianya.cn/question/6a073ef33b8fdffa

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,k;
     6     while(cin>>n>>k)
     7     {
     8         if((n&k)==k)
     9             cout<<1<<endl;
    10         else 
    11             cout<<0<<endl;
    12     }
    13     return 0;
    14 }
    View Code

      证明:
      利用数学归纳法:
      由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 &gt; 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。
      综上,结论得证!

  • 相关阅读:
    判断java中两个对象是否相等
    面试题记录
    springboot集成redis操作
    Java 之Integer相等比较
    CSS+DIV网页样式与布局:第二章:CSS的基本语法
    JSP标签:jsp内置标签、jstl标签、自定义标签
    jsp jstl标签库 el表达式
    mysql数据库修改字段类型
    读CSS DIV网页样式与布局心得体会
    Absolute(绝对定位)与relative(相对定位)的图文讲解
  • 原文地址:https://www.cnblogs.com/Beckinsale/p/7469842.html
Copyright © 2020-2023  润新知