题意:
输入整数n(1<=n<=3千万),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b。例如:n=7时,有4对:(3,2),(5,4),(6,4),(7,6)。
题解:
首先打表找规律,发现c=a-b
因为c是a的因数
要保证计算量尽量小,如果枚举a,就要枚举a的所有因数,有些数因为可能是多个数的因数,会被重复考虑很多次。所以这里要枚举因数 c ,a = k × c(k >= 2) 这样每个因数只枚举一遍,再检验b。
参考:http://www.cnblogs.com/naturepengchen/articles/3952145.html
注意算完后前缀和一下,因为题目要的n之前所有的整数对
代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 3e7;
int f[maxn+5];
void solve()
{
for(int c=1;c<=maxn/2;c++)
for(int a=2*c;a<=maxn;a+=c)
{
int b = a-c;
if((a^b)==c)
{
f[a]++;
}
}
for(int i=3;i<=maxn;i++)
f[i]+=f[i-1];
}
int main()
{
solve();
int T;
cin>>T;
long long n;
int k=1;
while(T--)
{
cin>>n;
printf("Case %d: %d\n",k++,f[n]);
}
return 0;
}