类似于线段树, 但分治时要处理出区间长度
#include <iostream> using namespace std; typedef long long ll; ll ql, qr, x; ll len(ll x) { return x<=1?x:len(x/2)*2+1; } ll dfs(ll l, ll r, ll v) { if (l==r) return v; ll mid = l+len(v/2), ans = 0; if (mid>ql) ans += dfs(l,mid-1,v/2); if (mid<qr) ans += dfs(mid+1,r,v/2); if (ql<=mid&&mid<=qr) ans += v&1; return ans; } int main() { cin>>x>>ql>>qr; cout<<dfs(1,len(x),x)<<endl; }