给定两个正整数N和M。 ,任务是找到N的最小除数D,使gcd(D,M)> 1 。如果没有这样的除数,则打印-1。
例子:
Input: N = 8, M = 10
Output: 2
Input: N = 8, M = 1
Output: -1
一个天真的方法是对每个因子进行迭代,并计算该因子和M的gcd。如果它超过M,那么我们就有了答案。
时间复杂度: O(N * log max(N,M))
一种有效的方法是迭代直到sqrt(n)并检查gcd(i,m)。如果gcd(i,m)> 1,则打印并破坏它,否则我们检查gcd(n / i,m)并存储其中的最小值。
下面是上述方法的实现。
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to find the minimum divisor
int findMinimum(int n, int m)
{
int mini = m;
// Iterate for all factors of N
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
int sec = n / i;
// Check for gcd > 1
if (__gcd(m, i) > 1) {
return i;
}
// Check for gcd > 1
else if (__gcd(sec, m) > 1) {
mini = min(sec, mini);
}
}
}
// If gcd is m itself
if (mini == m)
return -1;
else
return mini;
}
// Drivers code
int main()
{
int n = 8, m = 10;
cout << findMinimum(n, m);
return 0;
}
Java
// Java implementation of the above approach
class GFG
{
static int __gcd(int a, int b)
{
if (b == 0)
return a;
return __gcd(b, a % b);
}
// Function to find the minimum divisor
static int findMinimum(int n, int m)
{
int mini = m;
// Iterate for all factors of N
for (int i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
int sec = n / i;
// Check for gcd > 1
if (__gcd(m, i) > 1)
{
return i;
}
// Check for gcd > 1
else if (__gcd(sec, m) > 1)
{
mini = Math.min(sec, mini);
}
}
}
// If gcd is m itself
if (mini == m)
return -1;
else
return mini;
}
// Driver code
public static void main (String[] args)
{
int n = 8, m = 10;
System.out.println(findMinimum(n, m));
}
}
// This code is contributed by chandan_jnu
Python3
# Python3 implementation of the above approach
import math
# Function to find the minimum divisor
def findMinimum(n, m):
mini, i = m, 1
# Iterate for all factors of N
while i * i <= n:
if n % i == 0:
sec = n // i
# Check for gcd > 1
if math.gcd(m, i) > 1:
return i
# Check for gcd > 1
elif math.gcd(sec, m) > 1:
mini = min(sec, mini)
i += 1
# If gcd is m itself
if mini == m:
return -1
else:
return mini
# Drivers code
if __name__ == "__main__":
n, m = 8, 10
print(findMinimum(n, m))
# This code is contributed by Rituraj Jain
C#
// C# implementation of the above approach
using System;
class GFG
{
static int __gcd(int a, int b)
{
if (b == 0)
return a;
return __gcd(b, a % b);
}
// Function to find the minimum divisor
static int findMinimum(int n, int m)
{
int mini = m;
// Iterate for all factors of N
for (int i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
int sec = n / i;
// Check for gcd > 1
if (__gcd(m, i) > 1)
{
return i;
}
// Check for gcd > 1
else if (__gcd(sec, m) > 1)
{
mini = Math.Min(sec, mini);
}
}
}
// If gcd is m itself
if (mini == m)
return -1;
else
return mini;
}
// Driver code
static void Main()
{
int n = 8, m = 10;
Console.WriteLine(findMinimum(n, m));
}
}
// This code is contributed by chandan_jnu
PHP
1
if (__gcd($m, $i) > 1)
{
return $i;
}
// Check for gcd > 1
else if (__gcd($sec, $m) > 1)
{
$mini = min($sec, $mini);
}
}
}
// If gcd is m itself
if ($mini == $m)
return -1;
else
return $mini;
}
// Driver code
$n = 8; $m = 10;
echo(findMinimum($n, $m));
// This code is contributed by Code_Mech.
输出:
2
时间复杂度: O(sqrt N * log max(N,M))