找到 GCD 大于 1 的最小和 Pair
给定两个正整数 A 和 B,任务是找到两个正整数,使它们属于[A, B] 范围,使得它们的 GCD 大于 1,并且它们的和是所有可能对中的最小值。
Input: 2, 3
Output: -1
Explanation: Clearly there doesn’t exits any pair for which gcd is greater than 1, Hence we simply return -1.
Input: 2 10
Output: 2 4
Explanation: The smallest pair for which GCD is greater than 1 is 2, 4 .
方法:这个问题可以基于以下观察:
Two consecutive even numbers have GCD greater than 1 and the difference among them is also minimum.
基于上述观察,最好找到值最接近范围下限的两个连续偶数对。请按照以下步骤解决此问题:
- 检查给定范围abs(A – B)的绝对差
- 如果abs(A – B) <= 1 ,则不存在任何 gcd 大于 1 的对,打印 -1 。
- 如果第一个值是偶数
- print (A, A+2)因为这些是 GCD 大于 1 的最小数。
- 如果第一个值是奇数
- 检查(B – A) == 2然后打印-1因为两个连续奇数的 GCD 总是 1
- 检查(B – A) > 2那么
- 如果A可以被 3 整除,则打印(A, A+3) ,
- 否则打印(A+1, A +3) 。
下面是上述方法的实现:
C++
// C++ code to implement the above approach
#include
using namespace std;
// Function to find the minimum Sum pair
// such that their GCD(x, y) > 1
void minPair(int A, int B)
{
// If absoulute difference is 1
// then no such pair exists
if (abs(B - A) <= 1)
cout << "-1";
else {
// Check if first number is even
if ((A % 2) == 0)
cout << A << " " << A + 2;
else {
if (B - A == 2) {
cout << -1;
}
else {
// Check if first number is
// divisible by 3
if (A % 3 == 0) {
cout << A << " " << A + 3;
}
else {
cout << A + 1 << " "
<< A + 3;
}
}
}
}
}
// Drive code
int main()
{
int A = 2;
int B = 10;
// Function call
minPair(A, B);
return 0;
}
输出
2 4
时间复杂度: O(1)
辅助空间: O(1)