百度之星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();
    }
}
相关推荐
INGNIGHT12 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805413 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山13 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds13 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183113 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx14 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791314 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐15 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归
charliejohn15 小时前
计算机考研 408 数据结构 堆的插入与删除 堆排序
算法
老鱼说AI16 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模