F.x?y?n!

x?y?n!

https://ac.nowcoder.com/acm/contest/120562/F

题意: 输出两个数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;
}
全部评论
我发现这种题可以设计程序直接让计算机枚举爆算,打印出你想要的变量,看看是否有某种关系,或者定值啥的性质,不一定要猜出,更可靠。
1 回复 分享
发布于 02-06 02:40 河北

相关推荐

01-22 14:36
门头沟学院 Java
不知道怎么取名字_:我就好奇,你是这家的hr还是?咋这都能搞到
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务