题意:求出最小的M使得,M|N最大,如果有相同的求最小的M,首先都先转化二进制是明显的,然后我们从N的最高位开始一位位的判断
1.如果N[i] = 1,为了满足M尽量小,可以让M[i] = 0, 2.当N[i] = 1,为了满足M最大,那么M[i] = 1,当然还有条件是M必须在[L,U]之间,所以如果小于L,那么这一位就必须是1,相反大于U,那么就必须是0,最后找到满足的1就可以得到答案了
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
unsigned n,l,r,tt,ans;
while (scanf("%u%u%u",&n,&l,&r) != EOF)
{
int maxbit = 0;
tt =r;
while (tt)
{
maxbit++;
tt /= 2;
}
maxbit -= 1;
ans = 0;
for (int i = maxbit; i >= 0; i--)
{
tt = ans + (1 << i);
if(( tt <= r && (n & 1<<i) == 0) || (ans < l && (l & 1<<i)))
ans = tt;
}
printf("%u\n",ans);
}
return 0;
}