Beautiful Number
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 915 Submit : 2443
Time Limit : 1000 MS Memory Limit : 65536 KB
Description
Beautiful Number
题目描述
如果一个数的二进制中只有1个0,那么我们称这样的数是“美丽数”,比如510=1012。 现在给你一个区间[a,b](1≤a≤b≤1018),求区间内有多少个“美丽数”。
输入
第一行是一个整数K,表示样例的个数。 每个样例是两个整数a和b。
输出
每行输出一个样例的结果。
样例输入
3
1 2
2 5
1 1000000000000000000
样例输出
1
2
1712
提示
第一个例子中,只有2是美丽数;
第二个例子中,2和5是美丽数;
方法:直接构造Beautiful Number
#include<stdio.h>
__int64 BN[3000]={0};
int main()
{
__int64 a,b;
int T,n=0,cnt;
int k[66];//存2进制数
for(int i=0;i<66;i++){//全放1
k[i]=1;
}
for(int i=2;i<=64;i++){//直接构造Beautiful Number,有2到64的长度
for(int j=2;j<=i;j++){//每种长度选一个1变成0,就构造了Beautiful Number
k[j]=0;
for(int d=1;d<=i;d++){//转换成10进制数存起来
BN[n]=BN[n]*2+k[d];
}
n++;
k[j]=1;
}
}
//这样的Beautiful Number是从小到大排列的
scanf("%d",&T);
while(T--){
scanf("%I64d %I64d",&a,&b);
cnt=0;
for(int i=0;i<n;i++){
if(BN[i]>=a&&BN[i]<=b)cnt++;//直接数
if(BN[i]>b)break;
}
printf("%d\n",cnt);
}
return 0;
}