百度之星2021——BD202104 萌新


输入格式:
本题有多组测试数据。
第一行一个数 T (1 ≤ T ≤ 1000) 表示一共有 T 组数据。对于每一组数据,输入一行两个数 a,b (1 ≤ a,b ≤ 1000000000)。
输出格式:
对每组数据,输出一行两个数分别表示最小与最大的 c,如果不存在满足题意的 c,则输出一行两个 -1。

样例1:

复制代码
5
2 3
4 6
14 64
114 514
1919 810

样例2:

复制代码
-1 -1
2 2
2 50
2 400
1109 1109

关键思路:

重点1:

(同余的定义):a mod c = b mod c, 那么a-b是c的倍数,即 c | (a - b)。
分析:
模运算:a mod c 表示 a 除以 c 的余数,可以表示为 a = k * c + r,其中 0 ≤ r < c;
那么有

复制代码
•	a mod c = r      ⇒       a = k * c + r
•	b mod c = r      ⇒       b = m * c + r

因此,a - b = (k - m) * c,即 a - b 是 c 的倍数。

重点2:

可以通过枚举a-b的因子去寻找最小和最大的 c 。

注意:当a=b的情况,此时a-b=0,因此需要单独处理:

  1. 如果a=b=1,则答案为-1,-1,
  2. 否则答案为2,a

具体C++代码为:

复制代码
#include<bits/stdc++.h> 
#include <iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<math.h>
#include <string.h>
using namespace std;
using namespace std;

int main( )
{
    int n;
    cin>>n;
    while(n--)
    {
        long long int a,b;
        cin>>a>>b;
        long long int cmax=abs(a-b);
        long long int cmin=0;
        if(cmax==0&&a>=2)cout<<2<<" "<<a<<endl;
        else if(cmax>=2)
        {
            for(int i=2;i*i<=cmax;i++)
            {
                if(cmax%i==0)
                {
                    cmin=i;break;
                }
            }
            if(cmin==0)cmin=cmax;
            cout<<cmin<<" "<<cmax<<endl;
        }
        else cout<<-1<<" "<<-1<<endl;
    }
    return 0;
}

Python代码:

复制代码
import math

def main():
    import sys
    input = sys.stdin.read  # 使用更可靠的输入方式
    data = input().split()
    idx = 0
    n = int(data[idx])
    idx += 1
    for _ in range(n):
        a = int(data[idx])
        b = int(data[idx + 1])
        idx += 2
        cmax = abs(a - b)
        cmin = 0
        if cmax == 0 and a >= 2:
            print(2, a)
        elif cmax >= 2:
            cmin = 0
            # 改用 math.sqrt 兼容旧版 Python
            sqrt_cmax = int(math.sqrt(cmax)) + 1
            for i in range(2, sqrt_cmax):
                if cmax % i == 0:
                    cmin = i
                    break
            if cmin == 0:
                cmin = cmax
            print(cmin, cmax)
        else:
            print(-1, -1)

if __name__ == "__main__":
    main()

Java代码:

复制代码
import java.util.Scanner;
import java.lang.Math;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        while (n-- > 0) {
            long a = scanner.nextLong();
            long b = scanner.nextLong();
            long cmax = Math.abs(a - b);
            long cmin = 0;
            
            if (cmax == 0 && a >= 2) {
                System.out.println("2 " + a);
            } else if (cmax >= 2) {
                for (long i = 2; i * i <= cmax; i++) {
                    if (cmax % i == 0) {
                        cmin = i;
                        break;
                    }
                }
                if (cmin == 0) {
                    cmin = cmax;
                }
                System.out.println(cmin + " " + cmax);
            } else {
                System.out.println("-1 -1");
            }
        }
        scanner.close();
    }
}
相关推荐
闻缺陷则喜何志丹1 分钟前
【 线性筛 调和级数】P7281 [COCI 2020/2021 #4] Vepar|普及+
c++·算法·洛谷·线性筛·调和级数
zzzsde3 分钟前
【Linux】线程概念与控制(1)线程基础与分页式存储管理
linux·运维·服务器·开发语言·算法
穿条秋裤到处跑4 分钟前
每日一道leetcode(2026.04.23):等值距离和
算法·leetcode·职场和发展
少许极端8 分钟前
算法奇妙屋(四十九)-贡献法
java·算法·leetcode·贡献法
武帝为此11 分钟前
【特征选择方法】
算法·数学建模
XS03010619 分钟前
Agent 记忆管理
大数据·人工智能·算法
探物 AI19 分钟前
【感知·算法】一文综述医学图像分割:从经典 U-Net 到 Mamba 的范式跃迁
算法
DevilSeagull20 分钟前
Rust 结构体详解:从定义到实例化的指南
开发语言·算法·安全·rust
乐观勇敢坚强的老彭27 分钟前
C++信奥洛谷循环章节练习题
java·c++·算法
Tina学编程28 分钟前
[HOT 100]今日一练------单词拆分
算法·hot 100