1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc3(x,y,z) scanf("%lld%lld%lld", &x, &y, &z) 6 #define pf(x) printf("%lld\n",x) 7 #define FOR(i,b,e) for(int i=b;i<=e;i++) 8 #define FOR1(i,b,e) for(int i=b;i>=e;i--) 9 #define CL(x,y) memset(x,y,sizeof(x)) 10 using namespace std; 11 typedef long long ll; 12 ll bit[35]; 13 int a[35]; 14 void init() 15 { 16 bit[0] = 1; 17 FOR(i,1,31) 18 { 19 bit[i] = 2 * bit[i-1]; 20 } 21 } 22 int main() 23 { 24 ll N, L, U, MAX; 25 init(); 26 // cout << bit[0] << endl; 27 while(~sc3(N, L, U)) 28 { 29 MAX = 0; 30 FOR(i,0,31) 31 { 32 a[i] = N % 2; 33 N /= 2; 34 } 35 FOR1(i,31,0) 36 { 37 MAX += bit[i]; 38 if((a[i] == 0 && MAX > U) || (MAX > L && a[i] == 1))//后面的条件是考虑可适合范围中最小的max值 39 MAX -= bit[i]; 40 } 41 pf(MAX); 42 } 43 return 0; 44 }
主要考虑的是二进制问题,还有其中合适范围内的最小的ans值,是一道不错的思维题