首页 > 其他分享 >Codeforces Round #843 (Div. 2) Problem C

Codeforces Round #843 (Div. 2) Problem C

时间:2023-01-11 18:22:33浏览次数:76  
标签:11 10 843 Petya 一位 solve test Problem Div

C. Interesting Sequence

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

 

 

Petya and his friend, robot Petya++, like to solve exciting math problems.One day Petya++ came up with the numbers nn and xx and wrote the following equality on the board:   n & (n+1) & … & m=x,n & (n+1) & … & m=x   where && denotes the bitwise AND operation. Then he suggested his friend Petya find such a minimal mm (m≥nm≥n) that the equality on the board holds. Unfortunately, Petya couldn't solve this problem in his head and decided to ask for computer help. He quickly wrote a program and found the answer.Can you solve this difficult problem?
Input Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤2000). The description of the test cases follows.The only line of each test case contains two integers n, x (0≤n,x≤10^18). Output For every test case, output the smallest possible value of mm such that equality holds.If the equality does not hold for any m, print −1 instead.We can show that if the required m exists, it does not exceed 5⋅10^18.   Example input 5 10 8 10 10 10 42 20 16 1000000000000000000 0 output

12
10
-1
24
1152921504606846976

Note

In the first example, 10 & 11=10, but 10 & 11 & 12=8, so the answer is 12.

In the second example, 10=10, so the answer is 10.

In the third example, we can see that the required m does not exist, so we have to print −1.

 

思路:

  我们可以

按位考虑。如果

  • n 在这一位上是 0 , x 在这一位上是 0
    • 选取任何的 m 都可行。
  • n 在这一位上是 0 , x 在这一位上是 1
    • 不可能实现。
  • n 在这一位上是 1 , x 在这一位上是 0
    • 必须等到某一个在这一位为 0 的数出现,才能满足要求。
    • 设这个数最小为 k ,则可行域与 [k,+∞] 取交集。
  • n 在这一位上是 1 , x 在这一位上是 1
    • m 必须在某一个在这一位为 0 的数出现之前,才能满足要求。
    • 设这个数最小为 k ,则可行域与 [n,k) 取交集。

最后,如果可行域不为空,输出最小元素。时间复杂度是 Θ(log⁡max(n,x))

代码:

 1 #include<bits/stdc++.h>
 2 #define N 70
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 void solve()
 7 {
 8     ll n,x;
 9     scanf("%lld%lld",&n,&x);
10     bitset<64> bn(n),bx(x);
11     ll l=n,r=5e18;
12     for(int i=63;i>=0;i--)
13     {
14         if(bn[i]==0 && bx[i]==1)
15         {
16             puts("-1");
17             return;
18         }
19         if(bn[i]==0 && bx[i]==0) continue;
20         if(bn[i]==1 && bx[i]==0)
21         {
22             l=max(l,((n/(1ll<<i))+1)*(1ll<<i));
23             //二进制 1010 * 10 = 10100
24             //一个数乘 100...00 相当于左移相应的位数
25             //一个数整除 100...00 相当于把这个1右边的所有位数变成0
26         }
27         else{
28             r=min(r,((n/(1ll<<i))+1)*(1ll<<i)-1);
29         }
30     }
31     
32     if(l<=r) printf("%lld\n",l);
33     else puts("-1");
34     
35     return ;
36 }
37 
38 int main()
39 {
40     int _;
41     cin>>_;
42     while(_--) solve();
43     return 0;
44 }

 

 


 

Noted by DanRan02

2023.1.11

 

标签:11,10,843,Petya,一位,solve,test,Problem,Div
From: https://www.cnblogs.com/DanRan02/p/17044599.html

相关文章

  • Codeforces Round #823 (Div. 2)
    A.B.C.DCodeforcesRound#823(Div.2)A.Planets-签到题意题意是一些卫星在一些轨道上,操作1花费1摧毁一个卫星,操作2花费\(y\)摧毁一个轨道上的所有卫星,问摧......
  • 一个CF1775C(Codeforces Round #843 (Div. 2))的小技巧
    若\(n\)的第\(i\)位为\(1\),而我们需要不断令\(n+1\)找到下一个最小的\(k\),使得\(k\)的第\(i\)位为\(0\)。技巧:假设\(n\)为10101[1]1001,括号内是要求的第\(i\)位那么先......
  • CF Codeforces Round #843 (Div. 2)
    CodeforcesRound#843(Div.2)本次脑袋不大灵光,一方面可能是怕掉分。另一方面就是交的人实在是太少了,导致我一直不敢交,其实这场cf没有我想象中那么难,甚至来说我一直是......
  • CF843记录
    正序开题A直接做完整版,一开始读错题了以为是任意字符串,想出来之后回去看题,发现只有ab,写了140+行的分讨,20:00才过。B又读错题以为是异或,想了一会儿发现读错题了,水题......
  • Codeforces Round #843 (Div. 2) 做题记录
    CodeforcesRound#843(Div.2)做题记录A1&A2.GardenerandtheCapybarasProblemCF1775A2GardenerandtheCapybaras题目大意:给你一个由a和b组成的字符串,要......
  • Codeforces Round #843 (Div. 2) C【思维】
    https://codeforces.com/contest/1775/problem/C题意题意是说,给你n和x,你要求出最小的满足要求的m,使得\(n\)&\((n+1)\)&\((n+2)\)&\(...\)&\(m=x\)若没有满足的输出-1......
  • Codeforces Round #843 (Div. 2) A~E
    A.GardenerandtheCapybaras这道题目就是想让我们输出三个字符串,然后又一个要求就是中间这个字符串具有最值(最大或最小)的字典序这里需要注意一下,这个字符串里面只有a......
  • Educational Codeforces Round 141 (Rated for Div. 2)
    比赛链接;A核心思路:其实我们不要被迷惑了,这就是一个构造题。如果遇到构造题没有思路的话。可以联想经典的构造。也就是一大一小进行构造。然后检查是否可行。//Problem:......
  • 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,......