Description

给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。

Solution

做过一道原题​​GCD和XOR​​。
瞬间切过。
gcd(a,b)≤a−b≤a⊕b(⊕是异或的意思)
因为gcd(a,b)=a⊕b
所以gcd(a,b)=a−b=a⊕b
因为gcd(a,b)=gcd(a−b,b)=a−b
所以a-b就是a和b的最大公因数。
所以a=ck,b=dk(c+1=d)。
所以每次枚举最大公因数k,然后再枚举倍数,复杂度O(n)。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int i,j,k,l,t,n,m,ans;
int main(){
scanf("%d",&n);
fo(i,1,n/2)fo(j,2,n/i)if(((i*j)^(i*(j-1)))==i)ans++;
printf("%d\n",ans);
}