您的位置:首页 > 其它

【JZOJ 4714】 公约数

2016-08-19 17:16 197 查看

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,因为a是其倍数,所以枚举会快很多。因为gcd(a,a−c)=c,所以只需判断a xor c=a−c=b即可

时间复杂度为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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: