UVa12716 GCD XOR

题目大意

1N 范围内有多少对数,满足它们的异或值等于它们的最大公约数。
T 组数据。

Data Constraint
2N1000000
T10000

题解

显然 a xor babgcd(a,b)
如果 a xor b=gcd(a,b)=c
那么 ab=c

所以枚举 c 和它的倍数a,在判断是否合法即可。

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 ;
}

以上.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值