首页 > 其他分享 >【题解】CF1748D ConstructOR

【题解】CF1748D ConstructOR

时间:2022-11-14 23:58:47浏览次数:57  
标签:le int 题解 最低 CF1748D divisible ConstructOR 位为

前言

这道题十分诈骗,比赛的时候以为是根据二进制除法原理,解同余方程,然后考试时候就没做出来QAQ。

这篇题解是构造解法,至于官方题解是啥我也不知道,看这官方题解的性质十分诡异。 (其实就是我英语不好看不懂)

题面

题目描述

You are given three integers $ a $ , $ b $ , and $ d $ . Your task is to find any integer $ x $ which satisfies all of the following conditions, or determine that no such integers exist:

  • $ 0 \le x \lt 2^{60} $ ;
  • $ a|x $ is divisible by $ d $ ;
  • $ b|x $ is divisible by $ d $ .

Here, $ | $ denotes the bitwise OR operation.

题面翻译

给定正整数 \(a,b,d\),求一个正整数 \(x\) 使得 \(d\mid(a\operatorname{or}x)\) 且 \(d\mid(b\operatorname{or}x)\),其中 \(\operatorname{or}\) 表示按位或运算。

数据范围

多组输入

\[1\le T\le 10^4,1\le a,b,d\le 2^{30} \]

思路

由于 \(x\) 必须满足

  • $ a|x $ is divisible by $ d $ ;
  • $ b|x $ is divisible by $ d $ .

所以显然的,如果当前存在解,那么一定存在一个 \(x\) 使得 \(x\) 包含 \(a|b\) 且 \(x\) 可以被 \(d\) 整除。即

  • \(x|(a|b)=x\) 且 \(x\) is divisible by $ d $

考虑无解情况

因为 \(x\) 必须被 \(d\) 整除 且 \(x|(a|b)=x\),所以如果 \(a|b\) 的最低位如果比 \(d\) 的最低位还低,那么 \(x\) 则无法被 \(d\) 整除,该情况无解。

考虑如何让 \(x\) 被 \(d\) 整除

首先我们让 \(x=0\) 设 \(c=a|b\) ,进行这么一个操作:

  • 每次找到他们二进制最低位 \(i\),使得 \(x\) 的 \(i\) 位为 \(0\) 且 \(c\) 的 \(i\) 位为 \(1\)。

  • 然后将 \(d\) 移动一定位数使得 \(d\) 的最低为 \(1\) 与 \(x\) 的 \(i\) 位对其,然后 \(x=x+d\)。

显然的,二进制高位的操作无法堆低位产生影响,所以,这样进行若干次操作后,就可以得到一个满足以条件的 \(x\)。

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int a,b,d;
signed main(){
    cin>>T;
    while(T--){
        cin>>a>>b>>d;
        int c=(a|b);
        int cnt=0;
        int x=0;
        bool flag=false;
        while(!(d&1)){//为了方便以下操作,我们将d的最低位1与0位对其
            if(c&1){//a|b的最低位1比d的最低位1还低,满足无解情况
                puts("-1");
                flag=true;
                break;
            }
            c>>=1;d>>=1;
            ++cnt;//记录对其所右移的次数,输出答案时需要移回去
        }
        if(flag) continue;
        for(int i=0;i<=30&&c;++i){
            if((c&1)&&!((x>>i)&1)){//找到他们二进制最低位 i,使得 x 的 i 位为 0 且 c 的 i 位为 1。
                x+=(d<<i);//将d的最低为1与i位对其
            }
            c>>=1;
        }
        cout<<(x<<cnt)<<endl;
    }
    return 0;
}

标签:le,int,题解,最低,CF1748D,divisible,ConstructOR,位为
From: https://www.cnblogs.com/I-am-yzh/p/16890983.html

相关文章

  • P8816 [CSP-J 2022] 上升点列 题解
    题目传送门:luoguP8816[CSP-J2022]上升点列这是一道简单的dp题。定义到达指两点的曼哈顿距离是\(1\)。我们考虑设状态\(f(i,j)\)表示考虑结尾是第\(i\)个点,增......
  • P6406 [COCI2014-2015#2] Norma 题解
    前言洛谷上很多大佬都写的CDQ分治的解法。但看了某篇大佬的线段树解法,受益匪浅,于是决定写一篇题解来记录一下这种解法。前置知识:单调栈,线段树题目通道题目描述给......
  • CF1743F Intersection and Union 题解
    更好体验线段的贡献不好统计,考虑统计每一个点在不同情况中的被覆盖次数,那么每个点的被覆盖次数总和即为答案。设\(f_{i,j,0/1}\)表示\(i\)点在扫描到线段\(j\)时是......
  • LG5283 [十二省联考 2019] 异或粽子 题解
    口胡一个异或经典问题LG5283[十二省联考2019]异或粽子给定一个长为\(n\)的序列,序列一段子区间\([l,r]\)的值为\([l,r]\)范围内所有数异或起来的值。现在求出前......
  • 题解 HDU4035 【Maze】
    postedon2022-08-1712:33:51|under题解|sourceproblemhttps://vjudge.net/problem/HDU-4035SHY在一棵树上随机游走,从根节点出发,每次有\(k_u\)的几率回到根节......
  • ARC 103 /\/\/\/ 题解
    前缀和一下,就好了#include<bits/stdc++.h>usingnamespacestd;typedefunsignedlonglongull;constintN=1e5+99;inta[N],odd[N],even[N];structcmp{ boolo......
  • CSP-S 2022 题解
    T1假期计划\(\ttloj3899\)/\(\ttuoj773\)首先数据规模是\(n\le2500\),提示我们用\(\mathcalO\left(n^2\right)\)的算法。既然是选择\(4\)个互不相同的点,不妨......
  • 题解:【ABC245F】Endless Walk
    题目链接本题解适合像我这样的不具备思维能力的选手。首先根据题意,一个点如果符合要求,那它必然在一个点数大于\(2\)的强联通分量里,因为如果只有一个点它就哪里都去不了......
  • Codeforces 722 F Cyclic Cipher 题解 (同余方程,two-pointers)
    题目链接前两天做过一个题意类似但做法不类似的题在这里首先做这道题需要一个结论:(一元)同余方程组有解的充要条件是方程组中的所有方程两两联立有解。证明两个同......
  • CF1650G 『Counting Shortcuts』 题解
    从洛谷博客那里搬过来的(图论专题本来打算先挑最简单的做,结果做了两个多小时(题意就是让你找从起点\(s\)到终点\(t\)的最短路以及次短路个数,本题次短路长度指的是最短......