#include<bits/stdc++.h>
#define int long long
using namespace std;

int l, r;
int a[100] = {1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215,33554431,67108863,134217727,268435455,536870911};
int b[100] = {1,3,14,60,248,1008,4064,16320,65408,261888,1048064,4193280,16775168,67104768,268427264,1073725440,4294934528,17179803648,68719345664,274877644800,1099511103488,4398045462528,17592183947264,70368739983360,281474968322048,1125899890065408,4503599593816064,18014398442373120,72057593903710208};

void solve1(){
	int cnt = 0;
	for(int i = l; i <= r; i ++ ){
		int x = i, s = 0;
		while(x){
			if(x % 2 == 1)s++;
			x /= 2;
		}
		if(s % 2 == 1)cnt+=i;
	}
	cout << cnt;
}

signed main(){
	
	cin >> l >> r;
	
	if(r <= 10000){
	    solve1();//暴力函数        
	    return 0;
	}
    
    //找 r 是否等于我们存储的数字
    int idx = -1;
    for(int i = 0; i < 29; i ++ )
        if(r == a[i]){
            idx = i;
            break;
        }
    if(l == 1 && idx != -1){
        cout << b[idx];
        return 0;
    }

	
    //先找出所有可能输入的 r
	// for(int k = 1; ; k ++ ){
	//     int r = (1 << k) - 1;
	//     if(r > 1e9)break;
	//     cout << r << ',';
	// }
    //cnt记录 1 ~ i当中符合条件的数字之和
	// int cnt = 0;
	// for(int i = 1; i <= 1e9; i ++ ){
 //        //判断数字i是否符合条件
	// 	int x = i, s = 0;
	// 	while(x){
	// 		if(x % 2 == 1)s++;
	// 		x /= 2;
	// 	}
	// 	if(s % 2 == 1)cnt+=i;
		
        //判断当前的 i 是否可能是 2^k - 1,是不是可能输入的r
	// 	bool flag = 0;
	// 	for(int j = 0; j < 29; j ++ )
	// 		if(i == a[j]){
	// 			flag = 1;
	// 			break;
	// 		}
	// 	if(flag)cout << cnt << ',';
	// }
	
	return 0;
}

5 条评论

  • 1