📌  相关文章
📜  使所有数组元素合一的最少gcd操作

📅  最后修改于: 2021-04-29 05:53:41             🧑  作者: Mango

给定一个大小为N的数组A []。您可以用该元素的gcd和该元素的任何相邻元素替换该数组中的任何数字。找到该操作的最小数目,以使整个数组的元素等于1。如果不可能,则打印-1。
例子:

Input : A[] = {4, 8, 9}
Output : 3
Explanation:
In the first move we choose (8, 9) 
gcd(8, 9) = 1. Now the array becomes {4, 1, 9}.
After second move, the array becomes {1, 1, 9}. 
After third move the array becomes {1, 1, 1}.

Input : A[] = { 5, 10, 2, 6 }
Output : 5
Explanation:
There is no pair with GCD equal one. We first
consider (5, 10) and replace 10 with 5. Now array
becomes { 5, 5, 2, 6 }. Now we consider pair (5, 2)
and replace 5 with 1, array becomes { 5, 1, 2, 6 }.
We have a 1, so further steps are simple.

Input : A[] = {8, 10, 12}
Output : -1
Explanation:
Its not possible to make all the element equal to 1.

Input : A[] = { 8, 10, 12, 6, 3 }
Output : 7 
  • 如果数组最初包含1,则我们的答案是数组大小与数组中个数之间的差。
  • 如果数组中没有元素等于1,则需要找到GCD等于1的最小子数组。我们的结果是N +(具有GCD 1的最小子数组的长度)–1。示例情况为{5,10,2,6}和{8,10,12,6,3}。

我们可以找到所有在O(N ^ 2)中的子数组,并且可以使用欧几里得算法在O(Log N)中计算GCD。
总体复杂度将为O(N ^ 2 Log N)。
这是上述想法的实现。

C++
// CPP program to find minimum GCD operations
// to make all array elements one.
#include 
using namespace std;
 
// Function to count number of moves.
int minimumMoves(int A[], int N)
{
   // Counting Number of ones.
    int one = 0;
    for (int i = 0; i < N; i++)
        if (A[i] == 1)
            one++;
 
    // If there is a one
    if (one != 0)
        return N - one;
     
    // Find smallest subarray with GCD equals
    // to one.
    int minimum = INT_MAX;
    for (int i = 0; i < N; i++) {
        int g = A[i]; // to calculate GCD
        for (int j = i + 1; j < N; j++) {
            g = __gcd(A[j], g);
            if (g == 1) {
                minimum = min(minimum, j - i);
                break;
            }
        }
    }
 
    if (minimum == INT_MAX) // Not Possible
        return -1;
    else
        return N + minimum - 1; // Final answer
}
 
// Driver code
int main()
{
    int A[] = { 2, 4, 3, 9 };
    int N = sizeof(A) / sizeof(A[0]);
    cout << minimumMoves(A, N);
    return 0;
}


Java
// Java program to find minimum GCD operations
// to make all array elements one.
import java.util.*;
 
class GFG {
     
//__gcd function
static int __gcd(int a, int b)
{
    if (a == 0)
    return b;
    return __gcd(b % a, a);
}
 
// Function to count number of moves.
static int minimumMoves(int A[], int N)
{
    // Counting Number of ones.
    int one = 0;
    for (int i = 0; i < N; i++)
    if (A[i] == 1)
        one++;
 
    // If there is a one
    if (one != 0)
    return N - one;
 
    // Find smallest subarray with
    // GCD equals to one.
    int minimum = Integer.MAX_VALUE;
    for (int i = 0; i < N; i++) {
         
    // to calculate GCD
    int g = A[i];
    for (int j = i + 1; j < N; j++) {
        g = __gcd(A[j], g);
        if (g == 1) {
        minimum = Math.min(minimum, j - i);
        break;
        }
    }
    }
 
    if (minimum == Integer.MAX_VALUE) // Not Possible
    return -1;
    else
    return N + minimum - 1; // Final answer
}
 
// Driver code
public static void main(String[] args)
{
    int A[] = {2, 4, 3, 9};
    int N = A.length;
    System.out.print(minimumMoves(A, N));
}
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python program to find
# minimum GCD operations
# to make all array elements one.
 
#__gcd function
def __gcd(a,b):
 
    if (a == 0):
        return b
    return __gcd(b % a, a)
  
# Function to count number of moves.
def minimumMoves(A,N):
 
    # Counting Number of ones.
    one = 0
    for i in range(N):
        if (A[i] == 1):
            one+=1
  
    # If there is a one
    if (one != 0):
        return N - one
      
    # Find smallest subarray with GCD equals
    # to one.
    minimum = +2147483647
    for i in range(N):
        g = A[i] # to calculate GCD
        for j in range(i + 1,N):
            g = __gcd(A[j], g)
            if (g == 1):
                minimum = min(minimum, j - i)
                break
  
    if (minimum == +2147483647): # Not Possible
        return -1
    else:
        return N + minimum - 1; # Final answer
 
 
# Driver program
A = [ 2, 4, 3, 9 ]
N = len(A)
print(minimumMoves(A, N))
 
# This code is contributed
# by Anant Agarwal.


C#
// C# program to find minimum GCD operations
// to make all array elements one.
using System;
 
class GFG {
     
//__gcd function
static int __gcd(int a, int b)
{
    if (a == 0)
    return b;
    return __gcd(b % a, a);
}
 
// Function to count number of moves.
static int minimumMoves(int []A, int N)
{
    // Counting Number of ones.
    int one = 0;
    for (int i = 0; i < N; i++)
    if (A[i] == 1)
        one++;
 
    // If there is a one
    if (one != 0)
    return N - one;
 
    // Find smallest subarray with
    // GCD equals to one.
    int minimum = int.MaxValue;
    for (int i = 0; i < N; i++) {
         
    // to calculate GCD
    int g = A[i];
    for (int j = i + 1; j < N; j++) {
        g = __gcd(A[j], g);
        if (g == 1) {
        minimum = Math.Min(minimum, j - i);
        break;
        }
    }
    }
 
    if (minimum == int.MaxValue) // Not Possible
    return -1;
    else
    return N + minimum - 1; // Final answer
}
 
// Driver code
public static void Main()
{
    int []A = {2, 4, 3, 9};
    int N = A.Length;
    Console.WriteLine(minimumMoves(A, N));
}
}
 
// This code is contributed by vt_m.


PHP


Javascript


输出:

4