【JZOJ 4714】 公约数

来源:互联网 发布:分布式数据库解决方案 编辑:程序博客网 时间:2024/05/16 10:45

Description

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

Analysis

正解异常简单。
对于任意数对(a,b),不妨设a>b
首先a xor b=ca xor c=b
ab=c
gcd(a,b)=gcd(ab,b)ab
a xor bab,这个的证明很简单,二进制拆开看一看就可以发现。
你发现了什么?
gcd(a,b)ca xor b

gcd(a,b)=a xor b=c=ab
所以我们可以枚举c,因为a是其倍数,所以枚举会快很多。因为gcd(a,ac)=c,所以只需判断a xor c=ac=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);}
0 0
原创粉丝点击