百度之星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();
    }
}
相关推荐
handsomethefirst2 分钟前
【算法与数据结构】【面试经典150题】【题41-题45】
数据结构·算法·leetcode
2301_810160952 分钟前
C++中的状态模式
开发语言·c++·算法
xrgs_shz2 分钟前
图像的点运算(线性点运算和非线性点运算)
人工智能·算法·机器学习
qq_466302459 分钟前
vs2022 mn矩阵运算 加减乘除
c++·算法·矩阵
sin°θ_陈9 分钟前
前馈式3D Gaussian Splatting 研究地图(总览篇):解构七大路线,梳理方法谱系,看懂关键分歧与未来趋势
论文阅读·深度学习·算法·3d·aigc·空间计算·3dgs
阿Y加油吧14 分钟前
LeetCode 双指针经典双题解|盛最多水的容器 + 三数之和,从入门到进阶吃透套路
算法·leetcode·职场和发展
B站_计算机毕业设计之家24 分钟前
计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅
python·算法·机器学习·信息可视化·django·汽车·课程设计
格林威25 分钟前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,堡盟相机 C#实战代码深度解析
c++·人工智能·数码相机·opencv·算法·计算机视觉·c#
lvxiangyu1110 小时前
MPPI 算法证明重构:基于无穷维泛函变分与 KL 散度的构造性推导
算法·重构·最优控制·随机最优控制
2301_8184190110 小时前
C++中的解释器模式变体
开发语言·c++·算法