Дан набор положительных целых чисел и целое число k. Все элементы в наборе делятся на k.

Как проверить, является ли k наибольшим общим делителем некоторых элементов в наборе?

Моя идея: для каждого элемента a[i] в наборе я делю его на k. Затем я получаю НОД всех элементов в наборе (который был изменен после того, как я разделил). Если НОД равен 1, то k является НОД некоторых элементов в наборе.

Я сделал несколько тестовых примеров и все правильно понял. Но онлайн-судья не принимает. Пожалуйста, дайте мне идею или проверьте мой алгоритм и исправьте его. Большое спасибо.

Позвольте мне сказать это более ясно:

Например, a = {10, 15, 18}:

k = 5 - это НОД (10, 15). Ответ: true

k = 3 - это НОД (15, 18). Ответ: true

k = 1 - это НОД (10, 15, 18). Ответ: true

k = 6 не является НОД любой группы, содержащей более 2 целых чисел. Ответ: false

Размер набора: <= 100000

РЕДАКТИРОВАТЬ: извините за неправильный пример. Это была моя ошибка. k = 3 не является НОД (10, 18). Но я думал, ты знаешь, что это 15, верно. :) Спасибо за ваши ответы, комментарии и вклад. Я проголосовал за принятый ответ ниже.

0
Hoang Van Thien 26 Дек 2015 в 18:02

2 ответа

Лучший ответ

1 вопрос не соответствует примеру:

Для 10, 15, 18:

  • 3 не делится ни на 10, ни на 6
  • нет общего делителя

2 ваш вопрос можно сократить так:

  • k делит все элементы, поэтому разделите их => новый "уменьшенный" набор
  • если k был НОД некоторого подмножества, то соответствующее сокращенное подмножество имеет 1 как НОД (вместе они просты)
  • так что мы можем забыть k

3 проблема теперь в следующем: задан ли набор, является ли это подмножеством простых вместе элементов (или с 1 как НОД)?

Но если это верно для подмножества, это верно для всех элементов.

Итак, ваш алгоритм хорош: возьмите A1, A2 и GCD, затем GCD этого A3, ...

Если в какой-то момент вы получите 1, значит, все готово.

2
guillaume girod-vitouchkina 26 Дек 2015 в 21:07
int gcd(int a, int b) {
  int c;
  while(a != 0) {
     c = a;
     a = b%a;
     b = c;
  }
  return b;
}

bool function(int[] a, int n, int k) {
    int numberOfGCD = 0;
    for(int i = 0; i < n; i++)
        for(int j = i+1; j < n; j++)
            if(gcd(a[i], a[j]) == k) numberOfGCD++;
    return numberOfGCD > 1;
}
0
Paulo 26 Дек 2015 в 16:51