给定一个由N 个正整数和一个整数X组成的数组A[] ,任务是通过执行以下操作确定是否可以将所有数组元素转换为小于X的元素:
- 选择 2 个不同的索引j和k 。
- 选择一个索引i ,其中A[i] > X 。
- 替换A[i] = gcd(A[j], A[k])当且仅当 gcd(A[j], A[k]) ≠ 1。
例子:
Input: A[] = {2, 1, 5, 3, 6}, X = 4
Output: Yes
Explanation:
- Selecting i = 3, j = 4, k = 5, set A[i] = gcd(A[j], A[k]) = 3. Therefore, A[] modifies to {2, 1, 3, 3, 6}.
- Selecting i = 5, j = 4, k = 5, set A[i] = gcd(A[j], A[k]) = 3. Therefore, A[] modifies to {2, 1, 3, 3, 3}.
Input: A[] = {2, 3, 2, 5, 4}, X = 3
Output: Yes
处理方法:按照以下步骤解决问题:
- 找出gcd ≠ 1且gcd ≤ X 的两个数,然后,通过使用这两个数,可以将所需的数A[i]替换为gcd(A[j], A[k]) 。
- 使用gcd(x, y) ≤ min(x, y)的事实,可以将数组元素简化为≤ X 。
- 这样,数组的其余部分可以使用步骤2转换为≤ X。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to check if all array
// elements are≤ X
bool check(int A[], int X, int N)
{
for(int i = 0; i < N; i++)
{
if (A[i] > X)
{
return false;
}
}
return true;
}
// Function to check if all array elements
// can be reduced to less than X or not
bool findAns(int A[], int N, int X)
{
// Checks if all array elements
// are already ≤ X or not
if (check(A, X, N))
{
return true;
}
// Traverse every possible pair
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
// Calculate GCD of two
// array elements
int g = __gcd(A[i], A[j]);
// If gcd is ≠ 1
if (g != 1)
{
// If gcd is ≤ X, then a pair
// is present to reduce all
// array elements to ≤ X
if (g <= X)
{
return true;
}
}
}
}
// If no pair is present
// with gcd is ≤ X
return false;
}
// Driver Code
int main()
{
int X = 4;
int A[] = { 2, 1, 5, 3, 6 };
int N = 5;
if (findAns(A, N, X))
{
cout << "true";
}
else
{
cout << "false";
}
}
// This code is contributed by mohit kumar 29
Java
// Java Program to implement
// the above approach
import java.io.*;
import java.util.Arrays;
class GFG {
// Function to check if all array elements
// can be reduced to less than X or not
public static boolean findAns(
int[] A, int N, int X)
{
// Checks if all array elements
// are already ≤ X or not
if (check(A, X)) {
return true;
}
// Traverse every possible pair
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
// Calculate GCD of two
// array elements
int gcd = gcd(A[i], A[j]);
// If gcd is ≠ 1
if (gcd != 1) {
// If gcd is ≤ X, then a pair
// is present to reduce all
// array elements to ≤ X
if (gcd <= X) {
return true;
}
}
}
}
// If no pair is present
// with gcd is ≤ X
return false;
}
// Function to check if all array elements are≤ X
public static boolean check(int[] A, int X)
{
for (int i = 0; i < A.length; i++) {
if (A[i] > X) {
return false;
}
}
return true;
}
// Function to calculate gcd of two numbers
public static int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Driver Code
public static void main(String[] args)
{
int X = 4;
int[] A = { 2, 1, 5, 3, 6 };
int N = 5;
System.out.println(findAns(A, N, X));
}
}
Python3
# Python3 program to implement
# the above approach
# Function to check if all array elements
# can be reduced to less than X or not
def findAns(A, N, X):
# Checks if all array elements
# are already ≤ X or not
if (check(A, X)):
return True
# Traverse every possible pair
for i in range(N):
for j in range(i + 1, N):
# Calculate GCD of two
# array elements
gcd = GCD(A[i], A[j])
# If gcd is ≠ 1
if (gcd != 1):
# If gcd is ≤ X, then a pair
# is present to reduce all
# array elements to ≤ X
if (gcd <= X):
return True
# If no pair is present
# with gcd is ≤ X
return False
# Function to check if all array elements are≤ X
def check(A, X):
for i in range(len(A)):
if (A[i] > X):
return False
return True
# Function to calculate gcd of two numbers
def GCD(a, b):
if (b == 0):
return a
return GCD(b, a % b)
# Driver Code
X = 4
A = [ 2, 1, 5, 3, 6 ]
N = 5
print(findAns(A, N, X))
# This code is contributed by rohitsingh07052
C#
// C# Program to implement
// the above approach
using System;
class GFG {
// Function to check if all array elements
// can be reduced to less than X or not
public static bool findAns(
int[] A, int N, int X)
{
// Checks if all array elements
// are already ≤ X or not
if (check(A, X))
{
return true;
}
// Traverse every possible pair
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
// Calculate GCD of two
// array elements
int gcd = gcdFoo(A[i], A[j]);
// If gcd is ≠ 1
if (gcd != 1)
{
// If gcd is ≤ X, then a pair
// is present to reduce all
// array elements to ≤ X
if (gcd <= X)
{
return true;
}
}
}
}
// If no pair is present
// with gcd is ≤ X
return false;
}
// Function to check if all array elements are≤ X
public static bool check(int[] A, int X)
{
for (int i = 0; i < A.Length; i++)
{
if (A[i] > X)
{
return false;
}
}
return true;
}
// Function to calculate gcd of two numbers
static int gcdFoo(int a, int b)
{
if (b == 0)
return a;
return gcdFoo(b, a % b);
}
// Driver Code
public static void Main(String[] args)
{
int X = 4;
int[] A = { 2, 1, 5, 3, 6 };
int N = 5;
Console.WriteLine(findAns(A, N, X));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出
true
时间复杂度: O(N 2 )
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live