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的个数)
也就是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的推广应用 */
相关文章推荐
- 设计模式C++实现:代理模式
- iOS用户点击退出按钮,跳到登录界面的代码控制
- Python统计模块statistics用法精要
- 使用Jmeter测试FTP server
- 免费的WebService
- 正则正向预查
- Project Euler 93:Arithmetic expressions 算术表达式
- (五十八)结构与指针
- a's'd
- cpu类型 : armeabi armeabi-v7a mips x86 理解
- 约束5(constraints)
- 滚动条事件—固定div(第一篇)
- Mach-O 可执行文件
- iOS开发 @synthesize + @property 用法
- 【leetcode】 Power of Two
- Linux学习笔记(8)之Shell编程入门--输入输出、引号
- C++primer plus第六版课后编程练习答案13.3
- android sqlite 的架构和语法
- mysql中如何判断当前是字符 mysql判断字段中有无汉字
- PCA主成分分析学习