链接:https://ac.nowcoder.com/acm/contest/120562/F 来源:牛客网
题目大意:给定一个整数 n,你需要找到两个整数 𝑥 , 𝑦, x,y 满足如下条件:
gcd(x,y)=n, x⊕y 最小。
题目分析:要使gcd(x,y)=n,那么x和y就是n的倍数,即x=na,y=nb,同时满足gcd(a, b)=1,观察到n<2^31,所以直接令x=n<<31,y=x+n;这样a和b不相同的地方就只有n,x异或y就等于n了。同时要知道x异或y是>=(x-y)的绝对值的,异或是只看每一位是否相同,异为1,同为0,而(x-y)的绝对值低位不够时是会像高位借的,所以会消耗高位的1,导致结果变小。同时x和y又是n的倍数,所以(x-y)的绝对值必定>=n,当且仅当x和n的二进制上,没有任何一位是同时为1的,所以直接让x=n<<31即可。因为n<<31是直接把n的每一位二进制数整体向左挪31位,到了32位,而n仅在1到31位,二者无任何重叠的1/0。
下面看完整代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
ll n;
cin>>n;
ll x=n<<31;
ll y=x+n;
cout<<x<<" "<<y<<"\n";
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
}

京公网安备 11010502036488号