UVA 12716 GCD XOR(数论)
给出n(1<=n<=3e7), 在[1,n]内有多少对整数对,满足gcd(a,b)=a XOR b
异或的性质:
有 a xor b =c, 则 a xor c =b
可以证得,对于a>=b 有 a-b<=a xor b
又因为c是a,b得约数,所以有 c<=a-b
得 c<=a-b<=a xor b
若 a xor b = c ,则必有a-b=c
且 gcd(a,a-c)=c
所以
通过枚举c,通过与素数筛类似的方法得到以c为约数的合数a,
再得到b =a xor c ,那么只需判断是否 b=a-c 即可
也可以通过 b=a-c得到b,再判断 a xor b =c 即可
时间复杂度为O(nlogn)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int max_n=3e7+5;
long long f[max_n];
int main(void)
{
// freopen("out.txt","w",stdout);
memset(f,0,sizeof(f));
for(int c=1;c*2<max_n;c++)
for(int i=2;i*c<max_n;i++)
{
int a=c*i;
int b=a-c;
if((a^b)==c)f[a]++;
}
for(int i=2;i<max_n;i++)
f[i]+=f[i-1];
int t,e=1;
cin>>t;
while(t--){
int s;
cin>>s;
printf("Case %d: %lld\n",e++,f[s]);
}
// fclose(stdout);
}
//2
//7
//20000000