JZOJ 4714【NOIP2016提高A组模拟8.19】公约数
Description
给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。
Input
输入共一行,一个正整数n。
Output
输出共一行,一个正整数表示答案。
Sample Input
3
Sample Output
1
解释:只有(2,3)满足要求
对于30%的数据满足n<=1000
对于60%的数据满足n<=10^5
对于100%的数据满足n<=10^7
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, ans;
int main(){
freopen ("gcd.in", "r", stdin);
freopen ("gcd.out", "w", stdout);
scanf("%d", &n);
for(register int i=1; i<=n; i++)
for(register int j=2; j<=n/i; j++){
int a = i * j;
if( (i ^ a) == a - i ) ++ans;
}
printf("%d", ans);
return 0;
}
/*
设a > b
设cc = a ^ b = gcd(a, b)
考虑枚举cc,a = cc * i, b = a ^ cc
a ^ b = gcd(a, b) => gcd(a, a ^ cc) = cc => a ^ cc = a - cc(a > b)
所以b = a - cc, 若a ^ cc = a - c, 则ans++
*/