UVA12716:GCD XOR
UVA12716:GCD XOR
题意:
给定\(T\leq10^4\)组测试样例,询问\(\sum_{i=1}^n\sum_j^n[gcd(a,b)=a\ xor\ b]\)。
\(n\leq3*10^7\)。
思路:
设
\[gcd(a,b)=a\ xor\ b=c
\]
-
\(1:a\ xor\ b=c\),那么有\(a\ xor\ c=b\).
-
\(2:a-b\leq a\ xor\ b\).
-
\(3:gcd(a,b)=a\ xor\ b=c\),令\(a=k_1c,b=k_2c,(k_1\geq k_2)\)。
- \(a-b=(k_1-k_2)*c\)。
- 又因为\(a-b\leq c\)。
- 所以有\(a-b=c\)。
所以结果为:
\[a-b=a\ xor\ b
\]
的数对对数。
时间复杂度
\[n+\frac{n}{2}+\frac{n}{3}+...=n(1+\frac{1}{2}+\frac{1}{2}+...)=n(lnn+c)
\]
\(lnn+c\)为调和级数求和。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e7+10;
int ans[maxn];
void init(int n)
{
int k = n>>1;
for(int b = 1; b <= k; b++)
for(int a = b+b; a <= n; a += b)
if((a^b) == a-b) ans[a]++;
for(int i = 1; i <= n; i++)
ans[i] += ans[i-1];
}
int cas;
inline void solve()
{
int n; scanf("%d", &n);
printf("Case %d: %d\n", ++cas, ans[n]);
}
int main()
{
init(maxn-5);
int T; scanf("%d", &T);
while(T--) solve();
return 0;
}