HDU 4349 组合数的奇数个数-杨辉三角&Lucas定理

23 篇文章 0 订阅
8 篇文章 0 订阅

题意:给你一个n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇数的个数。

分析:

Lucas定理:

A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。
则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余

即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 

来看这一题,求奇数,那么我们就用二进制,这样一想思路就打开了,C(n,m)=C(a[nk1],b[mk1])*C(a[nk2][mk2])****(mod 2),我们知道C(0,1)是0,所以只要n的二进制位上为0的位置,如果m在该位的二进制是1,则C(n,m)模2就等于0,即为偶数,否则为奇数;而C(1,0),C(1,1)都为1,所以n的二进制位上为1的位置,m在对应位置可以填0也可以填1,这就变成了一个组合问题了,设n的二进制位共有k个1,那么使C(n,m)为奇数的m共有2^k种。

有些题不会做打表找规律也是个好方法

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int main()
{
	while(scanf("%d",&n)!=EOF){
		int tot=0;
		int j=n;
		int tmp=n&1;
	    while(j){
	    	if(tmp) tot++;
	    	j>>=1;
	    	tmp=j&1;
	    }
	    int ans=pow(2,tot);
		printf("%d\n",ans);
	}
}


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值