- 分享
打表?
- @ 2026-7-21 11:33:21
#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 条评论
-
冯建鑫 Lv.破阵 @ 2026-7-25 21:08:35
-
@ 2026-7-25 20:15:16forth floor
-
@ 2026-7-21 11:49:50third floor
-
@ 2026-7-21 11:36:28second floor
-
@ 2026-7-21 11:35:45first floor
- 1