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)
思路:用朴素的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; }