📜  转换数组,使数组的 GCD 变为 1

📅  最后修改于: 2022-05-13 01:57:50.438000             🧑  作者: Mango

转换数组,使数组的 GCD 变为 1

给定一个正元素数组和一个正整数 k,任务是将数组的 GCD 转换为 1。为了使其成为可能,只允许一个操作任意次数,即选择数组的任何元素并除以 a数字 d,其中 d <= k。
例子:

方法:

  • 如果存在一个大于 k 的正素数除以数组的每个元素,那么答案是否定的。
  • 如果数组的 GCD 的最大素因子小于或等于 k,那么答案是肯定的。
  • 首先,找到数组的 GCD,然后检查是否存在大于 k 的 GCD 的素数。
  • 为此,计算 GCD 的最大素数。

C++
// C++ program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
#include 
using namespace std;
 
// Function to get gcd of the array.
int getGcd(int* arr, int n)
{
    int gcd = arr[0];
    for (int i = 1; i < n; i++)
        gcd = __gcd(arr[i], gcd);
 
    return gcd;
}
 
// Function to check if it is possible.
bool convertGcd(int* arr, int n, int k)
{
    // Getting the gcd of array
    int gcd = getGcd(arr, n);
 
    // Initially taking max_prime factor is 1.
    int max_prime = 1;
 
    // find maximum of all the prime factors
    // till sqrt(gcd).
    for (int i = 2; i <= sqrt(gcd); i++) {
        while (gcd % i == 0) {
            gcd /= i;
            max_prime = max(max_prime, i);
        }
    }
 
    // either GCD is reduced to 1 or a prime factor
    // greater than sqrt(gcd)
    max_prime = max(max_prime, gcd);
 
    return (max_prime <= k);
}
 
// Drivers code
int main()
{
    int arr[] = { 10, 15, 30 };
    int k = 6;
    int n = sizeof(arr) / sizeof(arr[0]);
 
    if (convertGcd(arr, n, k) == true)
       cout << "Yes";
    else
       cout << "No";
 
    return 0;
}


Java
// Java program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
import java.io.*;
 
class GFG {
 
    // Recursive function to return
    // gcd of a and b
    static int __gcd(int a, int b)
    {
        // Everything divides 0
        if (a == 0 || b == 0)
            return 0;
     
        // base case
        if (a == b)
            return a;
     
        // a is greater
        if (a > b)
            return __gcd(a-b, b);
        return __gcd(a, b-a);
    }
     
    // Function to get gcd of the array.
    static int getGcd(int arr[], int n)
    {
        int gcd = arr[0];
        for (int i = 1; i < n; i++)
            gcd = __gcd(arr[i], gcd);
     
        return gcd;
    }
 
    // Function to check if it is possible.
    static boolean convertGcd(int []arr,
                             int n, int k)
    {
        // Getting the gcd of array
        int gcd = getGcd(arr, n);
     
        // Initially taking max_prime
        // factor is 1.
        int max_prime = 1;
     
        // find maximum of all the prime
        // factors till sqrt(gcd).
        for (int i = 2; i <= Math.sqrt(gcd);
                                        i++)
        {
            while (gcd % i == 0) {
                gcd /= i;
                max_prime =
                     Math.max(max_prime, i);
            }
        }
     
        // either GCD is reduced to 1 or a
        // prime factor greater than sqrt(gcd)
        max_prime = Math.max(max_prime, gcd);
     
        return (max_prime <= k);
    }
 
    // Drivers code
    public static void main (String[] args)
    {
        int []arr = { 10, 15, 30 };
        int k = 6;
        int n = arr.length;
     
        if (convertGcd(arr, n, k) == true)
            System.out.println( "Yes");
        else
            System.out.println( "No");
    }
}
 
// This code is contributed by anuj_67.


Python3
# Python 3 program to check if it is
# possible to convert the gcd of
# the array to 1 by applying the
# given operation
from math import gcd as __gcd, sqrt
 
# Function to get gcd of the array.
def getGcd(arr, n):
    gcd = arr[0];
    for i in range(1, n, 1):
        gcd = __gcd(arr[i], gcd)
 
    return gcd
 
# Function to check if it is possible.
def convertGcd(arr, n, k):
     
    # Getting the gcd of array
    gcd = getGcd(arr, n)
 
    # Initially taking max_prime
    # factor is 1.
    max_prime = 1
 
    # find maximum of all the
    # prime factors till sqrt(gcd)
    p = int(sqrt(gcd)) + 1
    for i in range(2, p, 1):
        while (gcd % i == 0):
            gcd = int(gcd / i)
            max_prime = max(max_prime, i)
 
    # either GCD is reduced to 1 or a
    # prime factor greater than sqrt(gcd)
    max_prime = max(max_prime, gcd)
 
    return (max_prime <= k)
 
# Drivers code
if __name__ == '__main__':
    arr = [10, 15, 30]
    k = 6
    n = len(arr)
 
    if (convertGcd(arr, n, k) == True):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by
# Sahil_Shelangia


C#
// C# program to check if it is
// possible to convert the gcd of
// the array to 1 by applying the
// given operation
using System;
 
class GFG {
 
    // Recursive function to return
    // gcd of a and b
    static int __gcd(int a, int b)
    {
        // Everything divides 0
        if (a == 0 || b == 0)
            return 0;
     
        // base case
        if (a == b)
            return a;
     
        // a is greater
        if (a > b)
            return __gcd(a-b, b);
        return __gcd(a, b-a);
    }
     
    // Function to get gcd of the array.
    static int getGcd(int []arr, int n)
    {
        int gcd = arr[0];
        for (int i = 1; i < n; i++)
            gcd = __gcd(arr[i], gcd);
     
        return gcd;
    }
 
    // Function to check if it is possible.
    static bool convertGcd(int []arr,
                            int n, int k)
    {
        // Getting the gcd of array
        int gcd = getGcd(arr, n);
     
        // Initially taking max_prime
        // factor is 1.
        int max_prime = 1;
     
        // find maximum of all the prime
        // factors till sqrt(gcd).
        for (int i = 2; i <= Math.Sqrt(gcd);
                                        i++)
        {
            while (gcd % i == 0) {
                gcd /= i;
                max_prime =
                    Math.Max(max_prime, i);
            }
        }
     
        // either GCD is reduced to 1 or a
        // prime factor greater than sqrt(gcd)
        max_prime = Math.Max(max_prime, gcd);
     
        return (max_prime <= k);
    }
 
    // Drivers code
    public static void Main ()
    {
        int []arr = { 10, 15, 30 };
        int k = 6;
        int n = arr.Length;
     
        if (convertGcd(arr, n, k) == true)
            Console.WriteLine( "Yes");
        else
            Console.WriteLine( "No");
    }
}
 
// This code is contributed by anuj_67.


PHP
 $b)
        return __gcd($a - $b , $b) ;
 
    return __gcd( $a , $b - $a) ;
}
 
// Function to get gcd of the array.
function getGcd($arr, $n)
{
    $gcd = $arr[0];
    for ($i = 1; $i < $n; $i++)
        $gcd = __gcd($arr[$i], $gcd);
 
    return $gcd;
}
 
// Function to check if it is possible.
function convertGcd( $arr, $n, $k)
{
     
    // Getting the gcd of array
    $gcd = getGcd($arr, $n);
 
    // Initially taking max_prime
    // factor is 1.
    $max_prime = 1;
 
    // find maximum of all the prime
    // factors till sqrt(gcd).
    for($i = 2; $i <= sqrt($gcd); $i++)
    {
        while ($gcd % $i == 0)
        {
            $gcd /= $i;
            $max_prime = max($max_prime, $i);
        }
    }
 
    // either GCD is reduced
    // to 1 or a prime factor
    // greater than sqrt(gcd)
    $max_prime = max($max_prime, $gcd);
 
    return ($max_prime <= $k);
}
 
    // Driver Code
    $arr = array(10, 15, 30);
    $k = 6;
    $n = count($arr);
 
    if (convertGcd($arr, $n, $k) == true)
        echo "Yes";
    else
        echo "No";
 
// This code is contributed by anuj_67.
?>


Javascript


输出:
Yes