UVa 12716 (GCD == XOR)

该博客讨论了UVa 12716题目,涉及寻找二元组(A, B),满足1 <= A <= B <= N且A的异或值等于A和B的最大公约数(GCD)。通过数学分析,作者证明了当AxorB==gcd(A, B)时,A-B==gcd(A, B)。接着,文章提出了枚举最大公约数C,并通过B==AxorC == A-C来解决这个问题。" 124967122,13990441,STM32单片机FLASH编程原理与实践,"['嵌入式硬件', 'STM32', '单片机', '编程', '下载算法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题意:
    • 给定N,求二元组(A,B)的个数,满足:
    • 1<=A<=B<=NAxorB==gcd(AB)
  • 规模:

    • 1N30000000
    • T10000
  • 类型:

    • 数论,gcd
  • 分析:

    • 这里有一个规律:
    • 如果AxorB==gcd(A,B),则A-B==gcd(A,B)
    • 证明:

      • 1式:AxorB>=AB
        • 这里考虑将AB对应位数字不同的位置,交换使得,1在A里,0在B里,
        • 这样变化后异或值不变,但A-B增大。极限情况下AxorB==AB
      • 2式:gcd(A,B)<=AB ( 这个易证 )
      • 而我们有 AxorB==gcd(A,B),由12两式AxorB==(AB)==gcd(A,B)
    • 接下来,枚举gcd(A,B)(设为C)的值,A是C的倍数,看B是否符合

    • B==AxorC ==A-C
  • 代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<algorithm>
#include<iostream>


using namespace std;

const int INF=0x3fff3fff;
const int MAXN=3e7+10;
const int MAXM=40010;
const int MOD=10001;
typedef long long ll;

long long  n,m;
//long long x[2100];
int aa[MAXN];
int ans[MAXN];
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int T,n,a,b,c;
    memset(ans,0,sizeof(ans));
    memset(aa,0,sizeof(ans));
    for(int i=1;i<MAXN;i++){
       // cout<<i<<endl;
        for(int j=2;j*i<MAXN;j++){
            c=i;a=i*j;
            b=c^a;//b=a-c
            if(b==a-c){aa[a]++;}
        }
    }
    for(int i=2;i<MAXN;i++){
        ans[i]=ans[i-1]+aa[i];
        //cout<<aa[i]<<",";
    }
    cin>>T;
    int kase=0;
    while(T--){
        cin>>n;
        printf("Case %d: %d\n", ++kase, ans[n]);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值