题意: 输出两个数a,b使gcd(a,b)=n,并最大化a^b。(gcd是最大公约数,^是按位异或)

知识点: 思维

思路: 通过枚举或者你惊人的注意力注意到max(a^b)=n,所以我们只要设法让a和b不相同的部分只有那个n就可以了,因为n<2^31,所以我们可以直接将x设为n算数左移32位,然后y=x+n这样前边都相同,只有后边的n的部分不相同,异或就等于n了,当然如果你闲的没事干你也可以自己算一下n的有效位数然后更优雅的在后边留够0能加上n而不进位。这里有两个函数可以帮到你__builtin_clz(n):这个函数会返回他在int中未占用的位数,使用32减去返回值就可以得到总位数,__builtin_ctz(n):这个函数会返回后边有多少个连续的0,这样你只要循环左移32-__builtin_clz(n)-__builtin_ctz(n)就可以得到最恰当的位数了

参考代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		int t=32-__builtin_clz(n)-__builtin_ctz(n);
		int x=(n<<t);
		int y=x+n;
		cout << x << ' ' << y << endl;
	}
	return 0;
}