题意:输入整数n(1<=n<=30000000),有多少对整数(a,b)满足1<=b<=a<=n,且gcd(a,b) = a ^ b.
思路:1.a ^ b = c,那么a ^ c = b,枚举a 和 c,算出b = a ^ c,验证gcd(a,b)是否等于c
2.发现规律gcd(a,b) = a ^ b = c => a - b = c。gcd(a,b) = gcd(a,a- c) = c,a是c的约数,可以枚举a和c,求b,验证a ^ b = c?
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
const int maxn = 30000000 + 2;
int n,f[maxn] = {0};
void init()
{
for(int c = 1;c <= maxn / 2;c++)
{
for(int a = c * 2;a <= maxn;a += c)
{
int b = a - c;
if(c == (a ^ b)) f[a]++;
}
}
for(int i = 2;i <= maxn;i++) f[i] += f[i - 1];
}
int main()
{
init();
int T; scanf("%d",&T);
for(int kase = 1;kase <= T;kase++)
{
scanf("%d",&n);
printf("Case %d: %d\n",kase,f[n]);
}
return 0;
}