把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解CF1775C

传送门:CF1775C

题意

对于给定的 nx,求可能存在的最小的 m, 使得 n&(n+1)&(n+2)&&m=x。如果不存在,输出 1

思路

先给出两个结论:

  • 对于一个二进制数的累加取与,必然是一个低位的 1 逐渐消失的过程。
  • 如果 n<x,必然输出 1
    如果 n=x,必然输出 n

以此 x 必然是由 n 二进制的前面一部分和一串 0 组成。
为了说明方便,将这一串 0 的第一位记为 idid 为成立的最小值)。
nid 位必然为 1

倘若 nid+1 位是 1,那么 m 在改变第 id 位时必然也会改变第 id+1 位,输出 1

否则 m=x|(1<<id+1)

AC代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int n, m,Q,p[70];
signed main() {
cin>>Q;
p[0]=1;
for(int i=1; i<=63; ++i) {
p[i]=p[i-1]*2;
}
while(Q--) {
int x;
cin>>n>>x;
if(x>n) {
cout<<-1<<endl;
continue;
} else if(x==n) {
cout<<x<<endl;
continue;
}
int ls=x^n,cnt=0;
bool flag=0;
while(ls) {
ls=ls>>1;
cnt++;
}
for(int i=0; i<=cnt; ++i) {
if(x&(p[i])) flag=1;
}
if(flag||n&p[cnt]) cout<<-1<<endl;
else {
cout<<(x^p[cnt])<<endl;
}
}
return 0;
}
posted @   djh0314  阅读(19)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示