• 第12届北师大校赛热身赛第二场 C. 组合数


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

    C. 组合数

    1000ms
    1000ms
    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 0
    2 1
    3 2
    

    Sample Output

    1
    0
    1



    数论问题:对组合数,若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<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
        int n,k;
        while(cin>>n>>k)
        {
            long t=n&k;
            if(t==k)
            {
                printf("1
    ");
            }
            else
            {
                printf("0
    ");
            }
        }
        return 0;
    }
    
    




  • 相关阅读:
    Video Test Pattern Generator(7.0)软件调试记录
    阅读<Video Test Pattern Generator v7.0>笔记
    阅读<Vivado Design Suite Tutorial---Logic Simulation>笔记
    Modelsim使用流程---基于TCL命令的仿真
    BT.656 NTSC制式彩条生成模块(verilog)
    Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程
    时钟分频方法---verilog代码
    手动按键复位程序(包含按键消抖)
    使用Vivado进行行为级仿真
    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4002454.html
Copyright © 2020-2023  润新知