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

题解CF1775C

传送门:CF1775C

题意

对于给定的 $n$ 和 $x$,求可能存在的最小的 $m$, 使得 $n\And (n+1) \And (n+2) \And \cdots \And m = x $。如果不存在,输出 $-1$。

思路

先给出两个结论:

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

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

倘若 $n$ 的 $id+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 @ 2023-01-11 10:17  djh0314  阅读(30)  评论(0)    收藏  举报  来源
浏览器标题切换
浏览器标题切换end