【NOIP2016提高A组模拟8.19】公约数

来源:互联网 发布:linux命令大全 编辑:程序博客网 时间:2024/05/22 06:32

Description

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

Input

输入共一行,一个正整数n。

Output

输出共一行,一个正整数表示答案。

Sample Input

3

Sample Output

1
解释:只有(2,3)满足要求

Data Constraint

对于30%的数据满足n<=1000
对于60%的数据满足n<=10^5
对于100%的数据满足n<=10^7

Solution

三十分暴力
六十分用了点神奇优化:两个数的二进制毕竟位数相同
100分:
当a>b
发现gcd(a,b)<=ab axorb<=ab
于是设c=a-b
枚举c和i,c*i=a
然后就没有然后了

Code

#include<cstdio>#define fo(i,a,b) for(int i=a;i<=b;i++)int n,ans;int main(){    scanf("%d",&n);ans=0;    fo(c,1,n) fo(i,2,n/c) if(((c*i)^(c))==c*(i-1)) ans++;    printf("%d",ans);}

看谁的代码比我短

0 0