Проверьте, можно ли преобразовать массив в другой, заменив пары на GCD.

Опубликовано: 25 Февраля, 2023

Даны массивы A[] и B[], каждый из которых имеет длину N , а A[i] содержит все элементы от 1 до N. Задача состоит в том, чтобы проверить, можно ли преобразовать A[] в B[], заменив любую пару A[] с их НОД.

Примеры:

Input: N = 2, A[] = {1, 2}, B[] = {1, 1}
Output: YES 
Explanation:
First Operation – For A[], choose i = 0 and j = 1. GCD(A[0], A[1]) = GCD(1, 2) = 1. Replace both the elements with GCD = 1. So A[] = {1, 1}.

Input: N = 3, A[] = {1, 2, 3}, B[] = {1, 2, 2}
Output: NO
Explanation: It can be verify that it’s not possible to convert A[] to B[] by using given operation. 

Подход: реализуйте приведенную ниже идею, чтобы решить проблему.

The problem is observation based and can be solved by calculating GCD of A[i] and B[i] for each index. It should be noted that if B[i]>A[i] at any index, then it is impossible to change A[i] as B[i].

So, This idea gives us approach if GCD(A[i], B[i]) = B[i], Then it is possible to convert A[i] to B[i] at that index, else not possible.  

Следуйте шагам, указанным ниже, чтобы реализовать идею:

  • Создайте флаг логической переменной и инициализируйте его. истинный.
  • Запустите цикл от i = 0 до N-1 :
    • Если НОД (А [я], В [я]) = В [я] затем продолжить цикл.
    • Еще отметьте флаг как ложный и разорвать цикл.
  • Если флаг истинен, то выведите YES, иначе NO.

Ниже приведена реализация описанного выше подхода.

Временная сложность: O(N * logM), где M — максимальный элемент B[].
Вспомогательное пространство: O(1)

Эффективный подход:

In this approach, We don’t need to calculate GCD at each index, Which will save a little bit of time. For A[i] and B[i], There are 3 possible cases. Which are discussed below:

  • If B[i] = A[i]: In such indices, We don’t need to perform the operation, Because A[i] is already equal to B[i].
  • If B[i] < A[i]: In this case, A[i] can be converted to B[i] only and only if A[i] % B[i] = 0. Formally B[i] is a perfect divisor of A[i].
  • If B[i] > A[i]: In this case, it is impossible to convert A[i] as B[i].

Следуйте шагам, указанным ниже, чтобы реализовать идею:

  • Создайте флаг логической переменной и инициализируйте его значением true.
  • Запустите цикл от i = 0 до N-1:
    • Если A[i] и B[i] равны, то цикл продолжается.
    • В противном случае, если B[i] < A[i], то продолжаться, только если B[i] точно делит A[i].
    • В противном случае пометьте флаг как ложный и разорвите цикл .
  • 3. Если флаг истинный вывод ДА иначе НЕТ.

Код для реализации подхода:

Временная сложность: O(N)
Вспомогательное пространство: O(1)

Статьи по Теме:

  • Введение в массивы - учебные пособия по структурам данных и алгоритмам