Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33

НОД на множестве чисел. Оптимизация

19.11.2023, 15:27. Показов 3050. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, вот задача:
Наибольшим общим делителем непустого набора натуральных чисел A называется максимальное натуральное число d, такое что оно является одновременно делителем всех чисел множества A.
Задан массив натуральных чисел [a{1}, a{2}, . . . , a{n}] и число k. Требуется выбрать в нем подмассив из k подряд идущих элементов [a{l}, a{l+1}, . . . , a{l+k−1}], чтобы их наибольший общий делитель был как можно больше, и вывести этот наибольший общий делитель.

Входные данные
Первая строка ввода содержит два целых числа n и k (2 ≤ n ≤ 500 000, 2 ≤ k ≤ n).
Вторая строка содержит n натуральных чисел a{1}, a{2}, . . . , a{n} (1 ≤ a{i} ≤ 1018).

Выходные данные
Выведите одно натуральное число — максимальное возможное значение наибольшего общего делителя элементов подмассива длины k заданного массива.

Входные данные
10 4
2 3 4 8 12 6 12 18 4 3
Выходные данные
6

Мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def nod(a, b):
  if b == 0:
    return a
  return nod(b, a%b)
 
n, k = map(int, input().split())
data = list(map(int, input().split()))
maxi = 1
for i in range(len(data)-k+1):
  nod1 = 0
  for j in range(i, i+k):
    if nod1 == 0:
      nod1 = data[j]
    nod1 = nod(data[j], nod1)
  maxi = max(nod1, maxi)
print(maxi)
Не проходит скрытые тесты из-за превышения времени ожидания (2500 мс). Как можно его оптимизировать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2023, 15:27
Ответы с готовыми решениями:

Найти НОД трёх чисел. Примечание. НОД(a,b,c)=НОД(НОД(a,b),c).
Кто может решить данную задачку (составить программу с помощью циклов)))) заранее спасибо)) Найти НОД трёх чисел. Примечание....

Даны n натуральных чисел. Найти их наибольший общий делитель, учитывая что НОД(а,б,с)=НОД(НОД(а,б)с)
даны n натуральных чисел. Найти их наибольший общий делитель, учитывая, что НОД(a,b,c) = НОД (НОД(a,b)c). При решении определите функцию...

Найти наибольший общий делитель чисел M и N. Используйте теорему Эйлера: Если M делится на N, то НОД (N, M)=N, иначе НОД (N, M)= =НОД (M mod N, N).
Найти наибольший общий делитель чисел M и N. Используйте теорему Эйлера: Если M делится на N, то НОД (N, M)=N, иначе НОД (N, M)= =НОД (M...

14
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
19.11.2023, 17:01
Python
1
2
3
4
from math import gcd
n, k = map(int, input().split())
*a, = map(int, input().split())
print(max(gcd(*a[i:i + k]) for i in range(n - k + 1)))
2
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
19.11.2023, 18:10  [ТС]
На 3 теста больше теперь проходит)
Осталось еще 15..(
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
19.11.2023, 18:59
aKrass, организуй ввод через stdin, ещё пару тестов пройдет.
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
19.11.2023, 19:42
Может так быстрее будет?
Python
1
2
3
4
5
6
from math import gcd
n, k = map(int, input('n, k->').split())
*a, = map(int, input('arr->').split())
for i in range(k-1):
    a = [gcd(a[i],a[i+1]) for i in range(len(a)-1)]
print(max(a))
0
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
19.11.2023, 20:01
Если задача взята из Тинькофф Поколение, B’, 2023-2024 или Yandex Algo 2023-2024. Параллель B’, то там дикое ограничение в 0,5 секунды
0
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
19.11.2023, 20:10  [ТС]
Цитата Сообщение от idealist Посмотреть сообщение
Может так быстрее будет?
На 2 теста меньше, чем у eaa

Добавлено через 2 минуты
Цитата Сообщение от thyrex Посмотреть сообщение
Если задача взята из Тинькофф Поколение, B’, 2023-2024 или Yandex Algo 2023-2024. Параллель B’, то там дикое ограничение в 0,5 секунды
Может быть оттуда, однако я ее сейчас решаю на другой платформе к подготовке по олимпиадам, тут более адекватное 2.5 с ограничение...
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
19.11.2023, 20:20
Цитата Сообщение от aKrass Посмотреть сообщение
на другой платформе к подготовке по олимпиадам
что за платформа?
а по задаче: дерево отрезков, скользящее окно.

Добавлено через 1 минуту
Цитата Сообщение от idealist Посмотреть сообщение
Может так быстрее будет?
за счёт чего быстрее? можете объяснить?

Добавлено через 37 секунд
циклы быстрее генераторов начали работать?
2
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
19.11.2023, 21:05  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
что за платформа?
а по задаче: дерево отрезков, скользящее окно
Silvertests
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
20.11.2023, 12:08
aKrass, держи дерево отрезков:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from math import gcd
 
 
def query(lo, hi):
    res = 0
    lo += n
    hi += n
    while lo <= hi:
        res = gcd(res, t[lo], t[hi])
        lo = (lo + 1) // 2
        hi = (hi - 1) // 2
    return res
 
 
n, k = map(int, input().split())
*a, = map(int, input().split())
# print(max(gcd(*a[i:i + k]) for i in range(n - k + 1)))
 
t = [0] * (n + 1) + a
 
for i in range(n - 1, 0, -1):
    t[i] = gcd(t[2 * i], t[2 * i + 1])
 
print(max(query(i + 1, i + k) for i in range(n - k + 1)))
вроде так, если с индексацией не ошибся.
2
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
20.11.2023, 12:15  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
aKrass, держи дерево отрезков:
5 тестов не проходит
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
20.11.2023, 12:24
aKrass, по времени или ответ неправильный?

Добавлено через 8 минут
делай "скользящее окно", там через префиксы и суффиксы можно считать.
1
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
20.11.2023, 12:25  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
aKrass, по времени или ответ неправильный?
время

Добавлено через 21 секунду
Цитата Сообщение от eaa Посмотреть сообщение
делай "скользящее окно", там через префиксы и суффиксы можно считать.
Понял, спасибо большое)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
20.11.2023, 15:05
Лучший ответ Сообщение было отмечено aKrass как решение

Решение

aKrass, странный у них тестер, один и тот же код выдает разный процент решений.
нижние 5 попыток дерево отрезков.
верхние 2 попытки, скользящее окно через префиксы и суффиксы.
1
1 / 1 / 0
Регистрация: 19.09.2023
Сообщений: 33
21.11.2023, 13:29  [ТС]
eaa, да, скользящее окно через префиксы и суффиксы помогло, спасибо большое Вам)

Добавлено через 1 час 12 минут
Цитата Сообщение от eaa Посмотреть сообщение
странный у них тестер, один и тот же код выдает разный процент решений.
сейчас попробовал поотправлять с деревом отрезков несколько раз
прошло с 5-й попытки)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2023, 13:29
Помогаю со студенческими работами здесь

Написать формулу, которая будет замкнута на множестве целых чисел, но не на множестве натуральных чисел
Напишите формулу Ф такую, что Я так понял, надо написать формулу, которая будет замкнута на множестве целых чисел, но не на...

Найти НОД трёх чисел, используя рекурсивную функцию нахождения НОД двух чисел
Помогите решить. 8. Найти НОД трёх чисел, используя рекурсивную функцию нахождения НОД двух чисел. Из трёх чисел найти пару чисел с...

Оптимизация НОД
Всем привет, на лето задали дз по информатике задача звучит так : &quot;Дано N чисел. Найти самое большое число, на которое делятся все N...

Даны натуральные числа m, n. Вычислить наибольший общий делитель чисел m, n (НОД), используя рекурсивную функцию вычисления НОД.
Даны натуральные числа m, n. Вычислить наибольший общий делитель чисел m, n (НОД), используя рекурсивную функцию вычисления НОД, основанную...

Составить алгоритм нахождения НОД трех натуральных чисел, используя вспомогательный алгоритм нахождения НОД двух чисел
Составить алгоритм нахождения НОД трех натуральных чисел, используя вспомогательный алгоритм нахождения НОД двух чисел.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru