题目大意
求
1−N
范围内有多少对数,满足它们的异或值等于它们的最大公约数。
T
组数据。
Data Constraint
T≤10000
题解
显然
a xor b≥a−b≥gcd(a,b)
如果
a xor b=gcd(a,b)=c
那么
a−b=c
所以枚举
c
和它的倍数
SRC
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
#define N 1000000 + 10
int n[N] ;
int T , Maxv ;
long long ans[N] ;
int gcd( int x , int y ) { return !y ? x : gcd( y , x % y ) ; }
int main() {
scanf( "%d" , &T ) ;
for (int i = 1 ; i <= T ; i ++ ) scanf( "%d" , &n[i] ) , Maxv = max( Maxv , n[i] ) ;
for (int i = 1 ; i <= Maxv / 2 ; i ++ ) {
for (int j = i * 2 ; j <= Maxv ; j += i ) {
if ( gcd( j , j - i ) == (j ^ (j - i)) ) ans[j] ++ ;
}
}
for (int i = 1 ; i <= Maxv ; i ++ ) ans[i] += ans[i-1] ;
for (int i = 1 ; i <= T ; i ++ ) printf( "%lld\n" , ans[n[i]] ) ;
return 0 ;
}
以上.