输入格式:
本题有多组测试数据。
第一行一个数 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,因此需要单独处理:
- 如果a=b=1,则答案为-1,-1,
- 否则答案为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();
}
}