Description
给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。
对于100%的数据满足n<=10^7
Analysis
正解异常简单。
对于任意数对
(a,b)
,不妨设
a>b
。
首先
a xor b=c⇒a xor c=b
设
a−b=c
gcd(a,b)=gcd(a−b,b)≤a−b
又
a xor b≥a−b
,这个的证明很简单,二进制拆开看一看就可以发现。
你发现了什么?
gcd(a,b)≤c≤a xor b
又
gcd(a,b)=a xor b=c=a−b
所以我们可以枚举
c
,因为
时间复杂度为
O(n/1+n/2+⋯+n/n)=O(nlogn)
Code
225bytes
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int main()
{
int n,ans=0;
scanf("%d",&n);
fo(i,1,n)
for(int j=i+i;j<=n;j+=i)
if((i^j)==j-i) ans++;
printf("%d",ans);
}