http://poj.org/problem?id=3252
题意
int zero=0; //从高位向低位搜索过程中出现0的位的个数
继续向低位搜索
注意:Round(y+1);
///Count(y+1)的得到小于 y+1 的 RN 数的个数
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<cstdlib> using namespace std; int a[35][35]; void solve()///初始化 { memset(a,0,sizeof(a)); for(int i=0; i<32; i++)///注意a[0][0]=1 ; { for(int j=0; j<=i; j++) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i-1][j-1]; } } } char s[1000]; int Count(int x) { int sum=0; int top=0; while(x) { s[++top]=x%2; ///变成二进制 x/=2; } for(int i=1; i<top-1; i++) ///位数小于长度的个数 for(int j=0; j<=(i-1)/2; j++) ///使用1的个数 他的组合数与排列0的种类数的组合数相同 sum+=a[i][j]; int zero=0; for(int i=top-1; i>0; i--) { if(s[i]) { /// x最少需要(top1+1)/2个0 /// zero表示前面已经用了0的个数 /// +1 表示该位置正在使用一个0 for(int j=(top+1)/2-(zero+1); j<=i-1; j++) sum+=a[i-1][j]; } else ///统计已经使用了多少个0 zero++; } return sum; } int main() { int x,y; solve(); while(~scanf("%d%d",&x,&y)) { // printf("%d\n%d\n",Count(x),Count(y)); ///Count(y+1)的得到小于 y+1 的 RN 数的个数 printf("%d\n",Count(y+1)-Count(x)); } return 0; }