Lucas定理的理解与应用

Lucas定理:用于计算组合数模除素数后的值,其实就是把(n,m)分别表示为p进制,累乘各位的可能取的个数,得到最终的结果;

推论:(n & m) == m则C(n,m)为奇数;即C(n,m) %2 = 1,即m二进制的每一位n都必须为1,所以n & m = m;

应用:

Xiao Ming's Hope

题意:问C(n,0),C(n,1)...C(n,n)中有多少个为奇数?(1 <= n <= 1e8)

ACM_cxlove的证明

思路:用朴素的n & m == m来枚举,会TLE;

==> C(n,i) %2 = 1;就表示n字元为1的位置,m任意为0或1。当n为0的字元,m确只能为0,因为若为1,则Lucas相乘为0;(C(0,0) = 1,C(0,1) = 0)

转化为n字元中1的个数问题;

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n) == 1){
        printf("%d\n",1<<__builtin_popcount(n));
    }
    return 0;
}

 

posted @ 2016-03-01 20:39  hxer  阅读(243)  评论(0编辑  收藏  举报