CF1688A Cirnos Perfect Bitmasks Classroom
题意
给出一个正整数 ,求出一个最小的正整数 ,使得 且 。
分析
根据按位与和按位异或的性质,题目的两个条件可以理解为 在二进制表示下至少有一位相同 ,至少有一位不同 。
显然最小的正整数为 ,我们从 的角度出发,可以发现以下两个性质:
- 若 ,根据样例可以得到 最小为 。
- 若 为大于 的奇数, 最小为 ,因为此时 末尾必与 相同且其他位有不同的。
然后考虑 为偶数时的解法。
为了让 尽可能小,我们让它与 重合的那位尽可能小,易知 二进制的最低位为 ,那么:
- 若 在二进制下每位上 的个数大于 ,说明 与 至少有一位不同,且此时 最小。
- 若 在二进制下每位上 的个数等于 ,说明 与 完全相同,为了让他们不同,末位改成 就可以了。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int t;
int main(){
t=read();
while(t--){
ll n=read();
if(n==1)
puts("3");
else if(n&1)
puts("1");
else{
if((n&-n)==n)
write(n+1);
else
write(n&-n);
puts("");
}
}
return 0;
}

浙公网安备 33010602011771号