您的位置:首页 > 其它

Lucas hdu4349

2015-12-03 17:25 281 查看
题意:给出一个数字n,(1<=n<=108),求解在C(n,0),C(n,1)......C(n,n)中有多少个奇数;

也就是C(n,i)%2==1的i的个数,其中(0<=i<=n).

解析:Lucas的应用,Lucas定理,见Lucas

根据Lucas有Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)

我们可以写成二进制的形式观察,比如
n=1001101,m是从000000到1001101的枚举,我们知道在该定理中

C(0,1)=0,因此如果n=1001101的0对应位置的m二进制位为1那么C(n,m) % 2==0,因此m对应n为0的

位置只能填0,而1的位置填0,填1都是1(C(1,0)=C(1,1)=1),不影响结果为奇数,并且保证不会

* 出n的范围,因此所有的情况即是n中1位置对应m位置0,1的枚举,那么结果很明显就是:2^(n中1的个数)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std ;

int main()
{
int n , ans ;
while(scanf("%d",&n)!=EOF && n >= 1)
{
ans = 0 ;
while(n)
{
if(n&1)ans++ ;
n>>=1 ;
}
printf("%d\n",1<<ans);
}
return 0;
}

/*
Auther:LIUYAN
2015.12.03

Lucas的推广应用
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: