D. ConstructOR
题意:给定a,b,d三个数,找一个数x,使a|x与b|x都可以被d整除,其中数据不超过1<<30
思路:找到d的lowbit位p,并判断a与b比p更low的bit位是否有1,如果有的话则通过OR运算也不能被d整除。如果没有更low的bit位,那么只要构造一个x出来,让a和b通过OR运算后为X,所以问题变成了如何构造这样的一个X的问题。
构造X:首先找到d的lowbit位p,然后枚举x的所有位,如果当前i位为0,那么x += d<<(i + 1 - p)位,因为这样右移的数位为 1 + 1 - p 位,即d*pow(2, i + 1 - p)。这里如果只左移i + 1位的话,会出现x某一些位为0的情况,虽然可以被d整除,但是跟a或b通过OR运算后会出现不能被d整除的情况。
#include <iostream> #include <vector> #include <string> #include <map> #include <cmath> using namespace std; typedef long long int ll; #define INT_MAX pow(2, 31) - 1 int main(){ ios::sync_with_stdio(false), cin.tie(nullptr); int N; cin >> N; while (N--){ ll a, b, d, p = 0, x = 0; cin >> a >> b >> d; for (int i = 0; i < 30; ++i){ if (!p && d & (1ll << i)){ p = i + 1; } if (!p && (a | b) & (1ll << i)) { x = -1; break; } if (p && !((x >> i) & 1)){ x += (d << (i + 1 - p)); } } cout << x << endl; } return 0; }