首页 > 其他分享 >Codeforces Round #843 (Div. 2) C【思维】

Codeforces Round #843 (Div. 2) C【思维】

时间:2023-01-11 01:55:05浏览次数:56  
标签:... 843 int ll Codeforces pos -- continue Div

https://codeforces.com/contest/1775/problem/C

题意

题意是说,给你n和x,你要求出最小的满足要求的m,使得 \(n\)&\((n+1)\)&\((n+2)\)&\(...\)&\(m=x\)

若没有满足的输出-1

思路

容易知道x的范围\(0\leq x \leq n\)

若\(x\)为0,答案是 \((1 << n的最高位的bit + 1)\)

若\(x\)为n,答案就是n

否则,先将\(x\)转化成二进制,\(x\)中至少有一个1,对于一个bit来说 n 0 x 1是不可能发生的,这一位x是1 只可能n取1,这个时候恰好满足“\(x\)最右边的1及之前的部分和\(n\)中对应的部分相同”,若这个条件不满足,输出-1

再来考虑这个位置之后的序列,x中的数肯定都是0了,假设n这一段数中,最高位上的数是1,此时x对应位上的数是0,可以知道此时肯定发生了进位,但是n和x的前缀又是完全相同的,故这种情况也不合法,输出-1

那么在这一段数中,\(n\)中就算有1,也不是紧邻着\(x\)中最右边的\(1\)的,我们只需要找到\(n\)中最低位的\(1\),设这个位置为\(i\),答案就是 \(((n >> i + 1) | 1) << i + 1\)

code

#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;
int T;
ll n, x;

int main() {
    cin >> T;
    while(T--) {
        cin >> n >> x;
        if(x > n) {
            puts("-1");
            continue;
        }
        if(x == n) {
            printf("%lld\n", n);
            continue;
        }
        if(x == 0) {
            for(int i = 60; i >= 0; i--) {
                if(n >> i & 1) {
                    printf("%lld\n", (1LL << (i + 1)));
                    break;
                }
            }
            continue;
        }
        int pos = -1;
        for(int i = 0; i <= 60; i++) {
            if(x >> i & 1) {
                pos = i;
                break;
            }
        }
        // [st...pos] ,  [pos + 1, ... , en]
        bool f = 1;
        for(int i = 60; i >= pos; i--) {
            if((x >> i & 1) != (n >> i & 1)) {
                f = 0;
                break;
            }
        }
        if(pos && (n >> (pos - 1) & 1)) f = 0;
        if(!f) {
            puts("-1");
            continue;
        }
        ll ans = 0;
        for(int i = pos - 1; i >= 0; i--) {
            if(n >> i & 1) {
                ans = ((n >> i + 1) | 1) << i + 1;
                break;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

标签:...,843,int,ll,Codeforces,pos,--,continue,Div
From: https://www.cnblogs.com/re0acm/p/17042686.html

相关文章

  • Codeforces Round #843 (Div. 2) A~E
    A.GardenerandtheCapybaras这道题目就是想让我们输出三个字符串,然后又一个要求就是中间这个字符串具有最值(最大或最小)的字典序这里需要注意一下,这个字符串里面只有a......
  • Educational Codeforces Round 141 (Rated for Div. 2)
    比赛链接;A核心思路:其实我们不要被迷惑了,这就是一个构造题。如果遇到构造题没有思路的话。可以联想经典的构造。也就是一大一小进行构造。然后检查是否可行。//Problem:......
  • Educational Codeforces Round 15
    EducationalCodeforcesRound15https://codeforces.com/contest/7023/6:ABC不会小学数学,基础差前面写的慢A.MaximumIncrease#include<bits/stdc++.h>usingna......
  • Codeforces Round #843 (Div. 2)
    CodeforcesRound#843(Div.2)https://codeforces.com/contest/1775CD都不会写的垃圾罢了A1.GardenerandtheCapybaras(easyversion)#include<bits/stdc++.h>......
  • Codeforces Round #843 (Div. 2) 题解
    A题目大意给你一个只含字母a,b字符串,要把它拆分成三段,使得其中间那段要么同时小于等于两边要么同时大于等于两边。题解由于只有a,b我们可以分讨解决如果\([2,......
  • Educational Codeforces Round 141 (Rated for Div. 2)(B,C,D)
    EducationalCodeforcesRound141(RatedforDiv.2)(B,C,D)BB这个题的大意是我们需要构造一个矩阵,我们需要这个矩阵的一个位置和它相邻位置的绝对值的不同数量最多我猜......
  • Educational Codeforces Round 141 (Rated for Div. 2)
    A-MakeitBeautiful题意:给出一个序列a,要求重新排列它,使前\(i-1\)个数之和不等于\(a_i\)思路:数据范围很小。用桶存数字,然后由大到小每种数字为一组循环输出即可赛时......
  • 2023.1.9(Educational Codeforces Round 141 & NEERC2017)
    A.YetAnotherTournamentLinkhttps://codeforces.com/contest/1783/problem/CStatement除了你以外有\(n\)个人,编号为\(0\ton-1\),每个人有两个权值\(a_i\)和......
  • Codeforces Round #645 (Div. 2) A-D
    A.ParkLighting题意:用1*2的方格去填充n*m的格子,可以重叠摆放,至少需要多少个分析:不重叠的情况下,横着摆与竖着摆的最少数量是一样的,贡献为\(\lfloor\frac{n......
  • div背面隐藏属性
    我们知道div这个dom元素视图是可分为:正面与背面——两个视觉面的。一般我们只关注正面视觉展示,但如果加上一些翻转效果时,背面展示可能会影响整体视觉效果。这个时候我......