解析: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的推广应用 */