UVa 12716 (GCD == XOR) GCD XOR

题意:

问整数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)

 1 #include <cstdio>
 2 const int maxn = 30000000;
 3 int ans[maxn + 10];
 4 
 5 int main()
 6 {
 7     //freopen("12716in.txt", "r", stdin);
 8 
 9     for(int c = 1; c <= maxn; c++)
10     {
11         for(int a = 2*c; a <= maxn; a += c)
12         {
13             int b = a - c;
14             if((a ^ c) == b) ans[a]++;
15         }
16     }
17     for(int i = 1; i <= maxn; ++i) ans[i] += ans[i-1];
18 
19     int T, n;
20     scanf("%d", &T);
21     for(int kase = 1; kase <= T; ++kase)
22     {
23         scanf("%d", &n);
24         printf("Case %d: %d
", kase, ans[n]);
25     }
26 
27     return 0;
28 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4162682.html