给定一个大小为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