题意:
问整数n以内,有多少对整数a、b满足(1≤b≤a)且gcd(a, b) = xor(a, b)
分析:
gcd和xor看起来风马牛不相及的运算,居然有一个比较"神奇"的结论:
设gcd(a, b) = xor(a, b) = c, 则 c = a - b
这里
有比较严格的证明。
有了这个结论后,我们可以枚举约数c,然后枚举c的倍数a,再根据c = a - b计算b,检验b是否满足gcd(a, b) = xor(a, b)
#include <cstdio>
const int maxn = ;
int ans[maxn + ]; int main()
{
//freopen("12716in.txt", "r", stdin); for(int c = ; c <= maxn; c++)
{
for(int a = *c; a <= maxn; a += c)
{
int b = a - c;
if((a ^ c) == b) ans[a]++;
}
}
for(int i = ; i <= maxn; ++i) ans[i] += ans[i-]; int T, n;
scanf("%d", &T);
for(int kase = ; kase <= T; ++kase)
{
scanf("%d", &n);
printf("Case %d: %d\n", kase, ans[n]);
} return ;
}
代码君