UVA12716 GCD等于XOR GCD XOR 题解

UVA12716

一道挺有意思的位运算的题。

gcd(a,b)ab 本来是没有什么联系的,也不好直接转化。

那么就需要一个中间数进行转化,一般来说会是一个临界值,否则不好找答案。

先观察 gcd(a,b),ab,可得 gcd(a,b)=gcd(b,ab)ab

然后观察 ab,由异或的性质易得 ababa+b

故当 gcd(a,b)=ab 时,gcd(a,b)=ab=ab

我们可以提前预处理,先枚举 gcd(a,b),然后枚举 ab 就可以了。

V=max{a},则时间复杂度为 O(VlogV+T)

代码:

const int N = 3e7 + 5;
int n;
int f[N];

void init() {
	for (int i = 1; i < N / 2; i++)
		for (int j = i * 2; j < N; j += i) {
		    int k = j - i;
		    if ((j ^ k) == i) f[j]++;
		}
	for (int i = 1; i < N; i++) f[i] += f[i - 1];
}

int main() {
	init();
	int T = read();
	for (int i = 1; i <= T; i++) {
		n = read();
		printf("Case %d: %d\n", i, f[n]);
	}
	return 0;
}
posted @   Pengzt  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示