题目描述

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));
}
}

[CF1748D] ConstructOR的更多相关文章

  1. No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

    Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...

  2. 分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  3. js中的constructor

    定义和用法 constructor 属性返回对创建此对象的 Date 函数的引用. 语法 object.constructor constructor属性不影响任何JavaScript的内部属性.in ...

  4. Java程序设计之Constructor

    插入段代码,下次回忆吧. 先新建一个Person类,代码如下: public class Person { private String name ; private int age; public ...

  5. prototype,__proto__,constructor

    proto属性: 所有对象都有此属性.但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持.它指向对象的原型,也就是你说的继承链里的原型.通过Object.getPrototypeO ...

  6. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. 一张图理解prototype、proto和constructor的三角关系

    × 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则 ...

  8. JavaScript中typeof、toString、instanceof、constructor与in

    JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定. 这也意味着你可以使用同一个变量保存不同类型的数据. 最新的 ECMAScrip ...

  9. js中constructor和prototype

    在最开始学习js的时候,我们在讲到原型链和构造函数的时候经常会有一个例子 如果我们定义函数如下: function Foo() { /* .. */ } Foo.prototype.bar = fun ...

  10. javascript中的prototype和constructor

    构造函数 我们知道,ECMAScript5中的Object.Array.Date.RegExp.Function等引用类型都是基于构造函数的,他们本身就是ECMAScript5原生的构造函数.比如,我 ...

随机推荐

  1. Kurator,你的分布式云原生解决方案

    本文分享自华为云社区<DTSE Tech Talk | 第40期:Kurator,你的分布式云原生解决方案>,作者:华为云社区精选. 什么是分布式云原生? 中国信通院给出的定义:分布式云原 ...

  2. SqlServer修改表字段类型

    if not exists (select 1 from syscolumns where name='字段名' and id=OBJECT_ID('表名') and 条件) begin alter ...

  3. Python隔离环境的搭建

    在nodejs中,我们可以指定扩展安装的路径,那么在python中,我们是不是也可以这么做呢? 当然可以,我们只需要安装一个扩展virtualenv或者virtual wrapper就可以实现环境的隔 ...

  4. 用OLED屏幕播放视频(1): 项目介绍

    下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这篇文章主要对项目的实现做整体的介绍, 包括硬 ...

  5. LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  6. Sealos 新功能“定时任务”上线(省钱大杀器)

    流量高峰时段资源不足?低流量时段服务器成本过高? 本着好用又省钱的目标,sealos 推出 定时任务 功能,保证稳定的同时降低成本. Sealos 国内集群:https://cloud.sealos. ...

  7. element-ui实现弹窗

    element-ui实现弹窗 需要的官网组件 要弹出的页面 <template> <el-form :model="ruleForm" :rules=" ...

  8. Django框架项目之项目基础——项目介绍、需求分析、pip安装源、环境搭建、前台、后台、跨域请求

    文章目录 1 路飞学城 1.1 企业的web项目类型 1.2 企业项目开发流程 1.3 立项申请阶段 2. 需求分析 2.1 首页 2.2 登录注册 2.3 课程列表 2.4 课程详情 2.5 购物车 ...

  9. MySQL系列之读写分离架构——Atlas介绍、安装配置、Atlas功能测试、生产用户要求、Atlas基本管理、自动分表、关于读写分离建议

    文章目录 1. Atlas介绍 2.安装配置 3. Atlas功能测试 4. 生产用户要求 5. Atlas基本管理 6. 自动分表 7. 关于读写分离建议 1. Atlas介绍 Atlas是由 Qi ...

  10. android开发阶段性技能

    一.初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android UI控件.Android Java层API相关使用. 迈向中级,最好再次更新下Java ...