CF768B 【Code For 1】
链接:Miku
-------------------------
这道题可以用分治来做,因为显然对于每一个数,我们可以把它分成两部分,分别处理,然后求和
不过唯一的问题是,n在操作最后的序列长度是多少,但是只要画个表,还是很显然的
注意数据范围
----------------------------
#include<iostream> #include<cmath> #include<cstdio> using namespace std; long long n,ans,l,r,lenght=1,a; long long fz(long long ll ,long long rr,long long n){ if(ll==rr) return n; long long mid=(ll+rr)>>1; long long anss=0; if(l<mid) anss+=fz(ll,mid-1,n>>1); if(r>mid) anss+=fz(mid+1,rr,n>>1); if(mid<=r&&mid>=l) anss+=(n%2); return anss; } int main(){ cin>>n>>l>>r; long long k=log2(n)+1; long long temp=2; if(n>1) while(k){ if(k%2) lenght*=temp; temp*=temp; k/=2; } else lenght=2; lenght--; cout<<fz(1,lenght,n); return 0; }