首页 > 其他分享 >[CF1748D] ConstructOR

[CF1748D] ConstructOR

时间:2022-12-22 18:23:03浏览次数:44  
标签:le 14 18 30 CF1748D solutions ConstructOR test

题目描述

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 $ .

输入格式

Each test contains multiple test cases. The first line of input contains one integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases.

Each test case consists of one line, containing three integers $ a $ , $ b $ , and $ d $ ( $ 1 \le a,b,d \lt 2^{30} $ ).

输出格式

For each test case print one integer. If there exists an integer $ x $ which satisfies all of the conditions from the statement, print $ x $ . Otherwise, print $ -1 $ .

If there are multiple solutions, you may print any of them.

样例 #1

样例输入 #1

8
12 39 5
6 8 14
100 200 200
3 4 6
2 2 2
18 27 3
420 666 69
987654321 123456789 999999999

样例输出 #1

18
14
-1
-1
0
11
25599
184470016815529983

提示

In the first test case, $ x=18 $ is one of the possible solutions, since $ 39|18=55 $ and $ 12|18=30 $ , both of which are multiples of $ d=5 $ .

In the second test case, $ x=14 $ is one of the possible solutions, since $ 8|14=6|14=14 $ , which is a multiple of $ d=14 $ .

In the third and fourth test cases, we can show that there are no solutions.

注意,后面的 \(|\) 都是代表按位或,而不是整除。

要让 \(a|x\) 是 \(d\) 的倍数,让 \(b|x\) 是 \(b\) 的倍数。要同时让两个数满足不好写,所以尝试让 \(a|x=b|x=x\),并让 \(x\) 位 \(d\) 的倍数。

为什么敢于放到这一步呢?其实发现 \(x\) 的取值范围很大,所以极有可能达到这个条件。要满足上面这个条件,不妨让 \(x\) 的后 30 位就是 \(a|b\) 就行了

换句话说,\(x\equiv a|b\pmod{2^{30}}\)

如果把 \(x\) 表示为 \(dk\),那么就是 \(dk\equiv a|b\pmod{2^{30}}\),拿个exgcd 就好了。exgcd 的解是肯定符合要求的,同时如果 exgcd 无解,肯定原来也无解。

但是有一个更简单的方法。

原方程有解的条件是 \(\gcd(d,2^{30})\) 能整除 \(a|b\),而 \(\gcd(d,2^{30})\) 就是 \(\mathrm{lowbit(d)}\),那么可以通过不断除以 2 来判断。最后如果有解的时候,\(d\) 的最后一位已经被除成 1 了。现在假设答案 \(ans\) 满足了前 \(j-1\) 位与 \(a|b\) 相等,但是第 \(j\) 位与 \(a|b\) 不等,那么可以让 \(ans\) 加上 \(d\times 2^j\)。那么此时答案的这一位会发生变化,然后一直弄到 \(a|b\) 已经全部被模仿出来。

由于 \(a|b<2^{30}\),解合法。

#include<bits/stdc++.h>
using namespace std;
int a,b,d,t,p,cnt;
long long ret;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&a,&b,&d);
		a|=b,p=1<<30,ret=cnt=0;
		while(!(d&1)&&!(a&1))
			a>>=1,d>>=1,p>>=1,++cnt;
		if(!(d&1))
		{
			printf("-1\n");
			continue;
		}
//		printf("%d %d %d\n",a,d,p);
		for(int i=0;(1LL<<i)<=p&&(1LL<<i)<=a;i++)
		{
			if((ret>>i&1)!=(a>>i&1))
				ret+=(1LL*d)<<i;
//			printf("%d\n",ret);
		}
		printf("%lld\n",ret*(1LL<<cnt));
	}
}

标签:le,14,18,30,CF1748D,solutions,ConstructOR,test
From: https://www.cnblogs.com/mekoszc/p/16999351.html

相关文章

  • 对象原型 原型链 原型继承 constructor属性
    原型:   每个构造函数身上都有一个prototype原型  原型身上有一个对象   被称为原型对象(构造函数的this和原型上的this都指向实例化对象)<body>......
  • CF1748D ConstructOR 题解
    可能更好的食用体验既然题目中用到了位运算,那我们就用二进制来解决这道题。1.判无解观察\(3\,4\,6\)这个样例,我们将其分解二进制:\[\begin{aligned}(3)_{10}&=(11)......
  • D. ConstructOR
    D.ConstructORYouaregiventhreeintegers$a$,$b$,and$d$.Yourtaskistofindanyinteger$x$whichsatisfiesallofthefollowingconditions,ordetermi......
  • 【题解】CF1748D ConstructOR
    前言这道题十分诈骗,比赛的时候以为是根据二进制除法原理,解同余方程,然后考试时候就没做出来QAQ。这篇题解是构造解法,至于官方题解是啥我也不知道,看这官方题解的性质十分诡......
  • CF1748D ConstructOR 题解
    可能更好的阅读体验题目传送门题目大意给定\(a,b,d\),要求找到一个\(0\lex\le2^{60}\),满足\(a|x,b|x\)都是\(d\)的倍数(\(|\)代表按位或)。\(T\le10^4\),\(0\le......
  • 构造方法(构造器 constructor)
    构造器用于对象的初始化,而不是创建对象!构造方法是负责初始化(装修),不是建房子构造器4个要点:构造器通过new关键字调用!!构造器虽然有返回值,但是不能定义返回值类型......
  • prototype和__proto__和constructor之间的关系
    深入理解原型到原型链探究prototype__proto__constructor构造函数创建对象我们知道我们可以直接定义对象或者可以用构造函数的方法创建对象functionPerson()......
  • js中的类和constructor
    问题一直搞不清constructor和super是干什么用的。前提了解js的继承原型继承原型继承是通过利用js的原型链functionPeople(name,age){this.name=name;this......
  • JS中的prototype、__proto__与constructor
    1.前言作为一名前端工程师,必须搞懂JS中的prototype、proto与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关......
  • @RequiredArgsConstructor
    @RequiredArgsConstructor注解@RequiredArgsConstructor生成带有必需参数的构造函数。必需的参数是最终字段和具有约束的字段,例如@NonNull。完整的文档可在@lconstru......