百度之星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();
    }
}
相关推荐
王景程7 小时前
什么是哈希函数
算法·哈希算法
会不再投降2198 小时前
《算法复杂度:数据结构世界里的“速度与激情”》
数据结构·算法
kaiaaaa8 小时前
算法训练第十五天
开发语言·python·算法
Coovally AI模型快速验证8 小时前
SLAM3R:基于单目视频的实时密集3D场景重建
神经网络·算法·3d·目标跟踪·音视频
Once_day9 小时前
代码训练LeetCode(29)最后一个单词的长度
算法·leetcode·c
凌肖战9 小时前
力扣上C语言编程题:最大子数组和(涉及数组)
c语言·算法·leetcode
蒟蒻小袁9 小时前
力扣面试150题--除法求值
算法·leetcode·面试
客卿1239 小时前
力扣hot100--反转链表
算法·leetcode·链表
wangjialelele9 小时前
动态内存管理之柔性数组
数据结构·算法