首页 > 其他分享 >Codeforces 1748 D

Codeforces 1748 D

时间:2022-11-15 11:33:55浏览次数:35  
标签:shift ll Codeforces 1ll 并且 倍数 1748

这场D还是很有趣的,值得探讨。

首先\(a|x,b|x\)是两个数,不相同时不太好做,所以我们能否找到一个\(x\),满足\(a|x=b|x\)并且都是\(d\)的倍数呢?

然后我们让\(d\)特殊一些——我们先解决\(d\)是奇数的问题。

只要\(x\)包含\(a,b\)中所有为\(1\)的位,并且是\(d\)的倍数就可以了,也就是\(x\&(a|b)=(a|b)\)并且\(x\equiv 0\mod d\)。

那么若\((a|b)\)的第\(i\)位为\(1\),我们可以让\(x+=2^i\times d\),这样\(x\)是\(d\)的倍数,并且由于\(d\)的最后一位为\(1\)(\(d\)是奇数),可以保证\(x\)的第\(i\)位也是\(1\),并且不改变第\(i\)位之前的数字。

程序实现就是下面这样子的:

for(ll i=0;i<30;i++) {
    if(((a|b)&(1ll<<i))>=1) {
	if((x&(1ll<<i))==0) {
		x+=(1ll<<i)*d;
	}
    }
}

那么\(d\)是偶数呢?此时\(d\)的有一系列后缀\(0\)。如果\((a|b)\)在这段内有\(1\),那么一定无解;否则我们可以先去除掉这些后缀\(0\),到最后输出答案时加上即可。

可以发现,\(x\)是不超过\(2^{30}\times d\)的,故满足题中\(x\leq 2^{60}\)的条件。

时间复杂度为\(O(T\log n)\)。

完整代码:

#include<bits/stdc++.h>
#define debug(...) std::cerr<<#__VA_ARGS__<<" : "<<__VA_ARGS__<<std::endl

using ll=long long;

void solve() {
	ll a,b,d;
	scanf("%lld%lld%lld",&a,&b,&d);
	ll shift=0,res=0;
	while(!(d&1ll)) d>>=1ll,shift++;
	for(ll i=0;i<shift;i++) {
		if((a&(1ll<<i))||(b&(1ll<<i))) {
			printf("-1\n");
			return;
		}
	}
	a>>=shift; b>>=shift;
	for(ll i=0;i<30;i++) {
		if(((a|b)&(1ll<<i))>=1) {
			if((res&(1ll<<i))==0) {
				res+=(1ll<<i)*d;
			}
		}
	}
	printf("%lld\n",res<<shift);
}

int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		solve();
	}
	return 0;
}

标签:shift,ll,Codeforces,1ll,并且,倍数,1748
From: https://www.cnblogs.com/Nastia/p/16891839.html

相关文章

  • 【题解】CF1748D ConstructOR
    前言这道题十分诈骗,比赛的时候以为是根据二进制除法原理,解同余方程,然后考试时候就没做出来QAQ。这篇题解是构造解法,至于官方题解是啥我也不知道,看这官方题解的性质十分诡......
  • Codeforces Round #833 (Div. 2)(持续更新)
    Preface我是大FW,B因为本地调试的时候把数组大小改成200忘记该回去了浪费了很多时间和罚时C刚开始也没想清楚WA了两发心态爆炸,然后D其实想出了一种做法但是心态崩了就没写......
  • Educational Codeforces Round 35 (Rated for Div. 2) F. Tree Destruction(树的直径/
    题目大意是给定一棵树,每次选择两个叶子将其删除,同时将两个叶子之间的简单路径长度加到答案上,找到一种方案使答案最大化,并输出删除的顺序。首先有一个结论是,距离树上某个节......
  • CF1748B Diverse Substrings
    题链:cfluogu诈骗题。Description给你一个数字(\(0\sim9\))组成的字串,问有多少个子串满足:不同数字种类数不少于相同数字的最多出现次数。Analysis暴力思路很好想其实......
  • Codeforces 722 F Cyclic Cipher 题解 (同余方程,two-pointers)
    题目链接前两天做过一个题意类似但做法不类似的题在这里首先做这道题需要一个结论:(一元)同余方程组有解的充要条件是方程组中的所有方程两两联立有解。证明两个同......
  • Codeforces 833 题解
    A\(n\)是奇数时恰好可以用完,\(n\)是偶数时多出来的一块没用,所以直接输出\((n+1)/2\)即可。B每个字符出现次数都小于等于字符总数,令\(\Sigma\)是字符集大小,那显然......
  • Codeforces Round #833 (Div. 2) A--B
    A思路:直接盲猜x/2上取整。应该写成(x+1)/2最好#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voids(){intn;cin>>n;cout<<(n+1)/2<<......
  • [VP]Codeforces Round #678 (Div. 2)
    诈骗题专场A.Reorder题意:给你一个长度为\(n\)的数组\(a\),问是否可以把这个重新排序后,使得\[\sum\limits^{n}_{i=1}\sum\limits^{n}_{j=i}\dfrac{a_j}{j}=m\]解法:......
  • CF1748E Yet Another Array Counting Problem 题解
    可能更好的阅读体验题目传送门题目大意给定一个长度为\(n\)的序列\(a\)和\(m\),定义\([l,r]\)的最左边的最大值为最小的\(l\lei\ler\)满足\(x_i=\max\{a_......
  • CF1748D ConstructOR 题解
    可能更好的阅读体验题目传送门题目大意给定\(a,b,d\),要求找到一个\(0\lex\le2^{60}\),满足\(a|x,b|x\)都是\(d\)的倍数(\(|\)代表按位或)。\(T\le10^4\),\(0\le......