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;