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

CF1748D ConstructOR 题解

时间:2022-11-13 18:13:23浏览次数:64  
标签:le 题目 数字 read 题解 CF1748D int ConstructOR

可能更好的阅读体验

题目传送门

题目大意

给定 \(a,b,d\),要求找到一个 \(0\le x\le 2^{60}\),满足 \(a|x,b|x\) 都是 \(d\) 的倍数(\(|\) 代表按位或)。
\(T\le 10^4\),\(0\le a,b,d\le 2^{30}\)

题目解析

乍一看没什么思路,赛时想了很久才做出来。

显然当 \(a,b\) 的最低位的 \(1\) 比 \(d\) 的最低位还要低的时候,无解。
首先我们发现要让两个数字都是 \(d\) 的倍数就很麻烦,所以我们可以试着让这两个数字变成一个数字。
设 \(c=a|b\),那么其实只要让 \(x|c=x\) 并且 \(x\) 是 \(d\) 的因数就可以了。
因为 \(x|c=x\),所以不难发现 \(x\) 的一些位必定为 \(1\)。
从低位到高位考虑 \(x\) 的每一个限制。如果当前 \(x\) 的这一位是 \(0\),但是 \(c\) 的这一位是 \(1\),那么我们就把 \(d\) 的最低位的 \(1\) 通过移位操作和这一位对齐,然后加上移位后的数字,这样这一位就是 \(1\) 了。
因为 \(a,b,d\le 2^{30}\) 所以这样构造出来的 \(x\) 满足 \(x\le(a|b)\times d\le 2^{60}\),一定合法。

ll a,b,c,d,ans; int cnt;
void work(){
	a=read(); b=read(); c=a|b; d=read(); ans=0; int i;
	cnt=0; for(i=0;i<30;i++) if(d&(1<<i)){ cnt=i; break; }
	for(i=0;i<30;i++) if((c&(1<<i))&&!(ans&(1<<i))){
		if(i<cnt){ puts("-1"); return; }
		ans+=(d<<(i-cnt));
	} print(ans),pc('\n'); assert((a|ans)%d==0&&(b|ans)%d==0); return;
}

标签:le,题目,数字,read,题解,CF1748D,int,ConstructOR
From: https://www.cnblogs.com/jiangtaizhe001/p/16886470.html

相关文章

  • 能力提升综合题单-模拟,前缀和差分 题解
    好久没有写题解了,今天回来了!!A-铺地毯在luogu,享受coding的快乐见到题以后,一道水题直接模拟二位数组。。。《真·ACcode》:点击查看代码#include<bits/stdc++.h>u......
  • CF1746D题解
    很好的一道贪心题。首先对于每条路径,由于要最大化权值,每条路径肯定要延伸到叶子节点。切入点肯定在\(|c_u-c_v|\leq1\),也就是说由节点\(i\)延伸下去的路径要均匀分配......
  • [CEOI2016] kangaroo题解
    P5999[CEOI2016]kangaroo一类插入式的dp。对于这道题,我们得先做出一个转化,依次考虑每个数插到哪个位置,于是变成了求\(1\)~\(n\)的排列同时满足每个位置上的元素要么......
  • P1858 多人背包 题解
    本题解灵感来源于题解P1858【多人背包】sto顾zorz本篇题解仅仅是对该题解的解释和说明。主要对原题解的解析部分加以补充:该文章中刷表的地方,是通过两个值去更新新......
  • 【题解】CSP-S2022 T2策略游戏
    简要题意有两串数A[1 n],B[1 m]A[1 n],B[1 m],有两个人小L和小QL和小Q,给出q组l1,r1,l2,r2q组l1,r1,l2,r2,对于每组,小L在A[l1 r1]A[l1 r1]中取一数x,小Q在B[l2 r2]B[l2......
  • Codeforces Round #833 (Div. 2) A-C题解
    比赛链接A、手摸不难发现,能做出的正方形大小就是当前的最大长度。所以直接输出向上取整即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineN......
  • CSP-J2022题解
    CSP-J2022题解T1乘方思路非常简单,直接for循环上就行了。为什么不会炸呢?因为就算a=1e9,乘两次也炸不了longlong。代码#include<cstdio>longlonga,n,ans=1;intmai......
  • 2022/11/12 模拟测题解
    2022/11/12模拟测题解A考场上推了一下,发现这个玩意挺有意思。一共有\((n+1)(m+1)\)个字符串,减去相同的个数,即可。这个相同的个数还是很好统计的,且这里指的相同仅仅是......
  • ACM-ICPC World Finals 2022 L Where Am I? 题解
    题目链接我们要干的事情其实是对于输入矩阵中的每个位置,求出从它开始至少走几步形成的序列能跟所有位置走同样步数形成的序列不同。注意到每个位置至少走\(200^2\)步就能......
  • ACM-ICPC World Finals 2022 L Where Am I? 题解
    题目链接我们要干的事情其实是对于输入矩阵中的每个位置,求出从它开始至少走几步形成的序列能跟所有位置走同样步数形成的序列不同。注意到每个位置至少走\(200^2\)步就能......