• ZOJ 2996 (1+x)^n【模板题】【常用技巧】


    (1+x)^n

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    Please calculate the coefficient modulo 2 of x^i in (1+x)^n.

    Input

    For each case, there are two integers n, i (0<=i<=n<=2^31-1)

    Output

    For each case, print the coefficient modulo 2 of x^i in (1+x)^n on a single line.

    Sample Input

    3 1
    4 2
    

    Sample Output

    1
    0

    计算Cm取n的奇偶性,则如果(m&n)==n则为奇数否则为偶数

    结论:对于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。 
    综上,结论得证! 


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


    #include <iostream>
    #include <stdio.h>
    #define INF 0x3f3f3f3f
    #define ms(x,y) memset(x,y,sizeof(x))
    using namespace std;
    
    typedef long long ll;
    
    const int mod = 1e9 + 7;
    const int maxn = 1e5 + 5;
    
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
    	int n,i;
    	while(~scanf("%d%d",&n,&i))
    	{
    		if((n&i)==i) puts("1");
    		else puts("0");
    	}
    	return 0;
    }



    Fighting~
  • 相关阅读:
    SAX解析XML笔记
    使用 Angular 2 来创建FlexGrid控件
    算法-快速排序(优雅版)
    使用泛型简化动态代理
    Java泛型概述
    POI-PPT官方文档
    Java 利用POI操作PPT
    Java8学习笔记(九)--日期/时间(Date Time)API指南
    Java8学习笔记(八)--方法引入的补充
    Android WebView加载本地html并实现Java与JS交互
  • 原文地址:https://www.cnblogs.com/Archger/p/12774702.html
Copyright © 2020-2023  润新知