Code For 1 CodeForces - 768B
题意:给出数字n,就像样例给的【3】=【1,1,1】 【6】=【3,0,3】=【1,1,1,0,1,1,1】.。。问l到r的区间内有多少1.
思路:一开始就想把都分解在一个字符串,再遍历算出来,然后就超时了。后来理解大佬的做法,给了查绚的 l 和 r 的,就以他们为界查讯。其实思路还是对一个数左右加。( :)每天和大佬在一起,为什么大佬总是大佬呢?菜鸡还是菜鸡呢???)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll len[55];
ll l,r,ans;
void dfs(ll n,ll left,ll right){
if(n==1){
ans++;return;
}
if(n==0){
return;
}
ll mid=(left+right)/2;
if(l<mid) dfs(n/2,left,mid-1);//长度的左边
if(l<=mid&&r>=mid){
if(n%2) ans++;
}
if(r>mid) dfs(n/2,mid+1,right); //长度的右边
}
int main(){
len[0]=1;
for(int i=1;i<=50;i++)
len[i]=2*len[i-1]+1;//长度 4-7 的长度是一样的
ll n;
cin>>n>>l>>r;
l=l-1;r=r-1;ans=0;
ll cnt=0;
while(len[cnt]<n) cnt++;
//l和r的取值是从1开始
dfs(n,0,len[cnt]-1);
cout<<ans<<endl;
return 0;
}