【NOIP提高】公约数

来源:互联网 发布:python谷歌浏览器驱动 编辑:程序博客网 时间:2024/05/29 19:54

Description

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

Solution

做过一道原题GCD和XOR。
瞬间切过。
gcd(a,b)abab(⊕是异或的意思)
因为gcd(a,b)=ab
所以gcd(a,b)=ab=ab
因为gcd(a,b)=gcd(ab,b)=ab
所以a-b就是a和b的最大公因数。
所以a=ck,b=dkc+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);}
1 0
原创粉丝点击