题目描述
给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。
n<=10^7
有一个很好证却不是一下就能发现的结论若gcd(a,b)=a^b,则gcd(a,b)=a^b=a-b
证明:gcd(a,b)<=a-b,a^b>=a-b,然后就可以得到结论了。
根据结论我们就可以枚举(a-b)的值,因为gcd(a,b)=a-b,(假设a>b)所以a=k(a-b),b=(k-1)(a-b),若a^b=a-b则ans++,复杂度O(n log n)。
代码
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define ll long long
using namespace std;
int i,j,n;
ll ans;
int main(){
scanf("%d",&n);
fo(i,1,n-1){
int x=i,y;
fo(j,2,n/i){
y=x+i;
if ((x^y)==i) ans++;
x+=i;
}
}
printf("%lld\n",ans);
}