[Lucas定理推广] hdu 4349 and poj 3219

hdu 4349 Xiao Ming's Hope

题意:

给n,求c(n,0),c(n,1)....c(n,n)中奇数的个数

思路:

因为只有奇偶区别,想到二进制

运用Lucas定理,将n,m(0~n) 化为二进制数

a,b为n,m的二进制数

根据定理 C(n,m)=C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])

然后因为C(0,1)=0、C(0,0)=1、C(1,0)=1、C(1,1)=1

为了保证C(n,m)=1

那么当n的二进制位上是0的时候,m的相应位置就必须是0

如果n的二进制位上是1的话,m是0或1都无所谓,就有两种取法

所以最后的答案就是2^cnt,cnt为n的二进制位上1的个数。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define ll __int64
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int cnt=0;
        while(n)
        {
            if(n%2==1) cnt++;
            n/=2;
        }
        printf("%d\n",1<<cnt);
    }
    return 0;
}
poj 3219 Binomial Coefficients

题意:

给n、m,问C(n,m)的奇偶性

思路:

上面的Lucas定理结论,

n和m全都转为二进制数

n的二进制位上为0的位置,如果对应m的位置上不是0,则结果为0

否则为1

那么其实就是对m来说,m上面是1的地方 对应过去是0 就是0

那么就是 (n&m)!=m 就为0 否则为1

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define ll __int64
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if((n&m)!=m) puts("0");
        else puts("1");
    }
    return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值