题意:求在区间内Sheldon数字的个数
题解:
枚举n m,然后判断是否可以组成相应的位数
然后再判断是否这个数字是在这个区间内
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
int a[100];
unsigned long long x,y;
bool deal(int len,int n,int m)
{
if(len==n&&m>1)
return false;
for(int i=0;i<len;){
if(i%(n+m)==0){
for(int j=0;j<n;j++)
a[i++]=1;
}
else if(i%(n+m)==n){
for(int j=0;j<m;j++)
a[i++]=0;
}
}
unsigned long long temp=0;
for(int i=0;i<len;i++)
temp=temp*2+a[i];
if(temp>=x&&temp<=y){
//printf("%d\n",temp);
return true;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%lld%lld",&x,&y)!=EOF)
{
unsigned long long t1=x,t2=y;
int p1=0,p2=0;
while(x){
p1++;
x/=2;
}
while(y){
p2++;
y/=2;
}
x=t1,y=t2;
LL ans=0;
if(x==0)
x++;
for(int i=1;i<=63;i++){
for(int j=1;j<=63;j++){
for(int k=p1;k<=p2;k++){
if(k%(i+j)==0||(k-i)%(i+j)==0)
if(deal(k,i,j))
ans++;
}
}
}
printf("%lld\n",ans);
}
return 0;
}