Python

Сижу уже час, не пойму где ошибка в коде. Задача с acmp.ru

Первые три теста проходит, четвёртый - неверный ответ. И фиг знает что именно за тест. Перепроверил код много раз, исправил косяки и недочёты, которые заметил, но безуспешно.

Задача:
https://acmp.ru/asp/do/index.asp?main=task&id_course=3&id_section=26&id_topic=225&id_problem=1467&ins=1#solution

Моё решение:
https://dropmefiles.com/zarIa (там кнопка "скачать" и текстовый файл с моим кодом)


Не вижу, что именно был за тест и из-за этого не могу исправить код.
Прогони тесты на этом:
 x, l = (int(s) for s in input().split())
j = min(x + n - (x + n) % n for r in range(2, int((x + 1) ** (1./l)) + 2) for n in (r ** l,))
print(j)

Я попробовал найти следующий юбилей для 999 999 999 999 лет с 50-ю нулями, отрабатывает за секунду (перебирает основания системы счисления до корня L-й степени из (X + 1) + 1, чтобы набрать нужное количество нулей).
Для сравнения, все варианты от нейросети в первом ответе даже на меньших данных задумываются на целую вечность, ответа не дождёшься.

Да, и возню с файлом сам приделай, у меня - только алгоритм.

Хотя, ладно, там дел на 1 мин:
 with open("input.txt", 'r') as f:
x, l = (int(s) for s in next(f).split())
j = min(x + n - (x + n) % n for r in range(2, int((x + 1) ** (1./l)) + 2) for n in (r ** l,))
print(j)
ДК
Дмитрий Классен
54 053
Лучший ответ
Олег Фролов Runtime error на третьем тесте оба кода выбивают
скинь на pastebin.com , у меня эта помойка не пашет
Дмитрий Классен Ты правда хочешь увидеть его неработающую поделку? Смысл?
Проблема возникает из-за того, что ваш алгоритм пытается перебрать все возможные значения числа от X до 9^99 и основания системы счисления от 2 до 36. Это очень неэффективно и может привести к чрезмерному использованию ресурсов, что, вероятно, и вызывает ошибку в задаче.

Что касается оптимизации вашего алгоритма, есть несколько способов улучшить его:

1. Вместо перебора чисел от X до 9^99 можно использовать бинарный поиск, чтобы найти минимальное число, у которого юбилейность хотя бы L. Это значительно сократит количество итераций.

2. Вместо того, чтобы переводить число во все возможные системы счисления и смотреть количество нулей в конце, можно переводить число только в системы счисления, которые могут дать желаемую юбилейность. Например, если L равно 8, то нет смысла переводить число в систему счисления с основанием 3, потому что такая система не может дать 8 нулей в конце. Можно ограничиться основаниями, которые являются степенями двойки, и это также ускорит алгоритм.

3. Вместо того, чтобы переводить число в строку и считать количество нулей в конце, можно использовать арифметику остатков. В отличие от работы со строками, арифметика остатков позволяет делать эти вычисления в числовой форме, что ускоряет процесс.

4. Tакже предлагаю вам взглянуть на другой подход к решению этой задачи. Фактически, юбилейность числа равна максимальной степени двойки, на которую делится это число. Следовательно, вместо перевода числа в разные системы счисления для определения юбилейности, можно напрямую работать с этими степенями. Это будет намного быстрее.

Успеха в решении этой задачи!
 def jubileyness(n): 
max_zeros = 0
for B in range(2, int(n**0.5) + 2): # перебор возможных оснований систем счисления
zeros = 0
temp = n
while temp % B == 0:
zeros += 1
temp //= B
max_zeros = max(max_zeros, zeros)
return max_zeros

X, L = map(int, input().split()) # чтение входных данных

current_age = X
while True: # перебор возможных возрастов
current_age += 1
if jubileyness(current_age) >= L:
print(current_age)
break
JE
Jasurbek Eshimbetov
3 288
Дмитрий Классен Сколько лет ждать, пока посчитает для триллиона?
К сожалению, я не могу открыть ваши предоставленные ссылки или пользоваться сервисом acmp.ru . Однако, я могу объяснить, как вы можете найти ошибку в своем коде.

1. Проверьте входные данные: Убедитесь, что вы правильно интерпретируете исходное условие и правильно обрабатываете входные данные. Проверьте, что вы верно читаете и обрабатываете входные значения с клавиатуры или файла.

2. Используйте отладку: Вставьте print-выражения в свой код, чтобы отслеживать значения переменных и шаги выполнения программы. Проверьте, что переменные содержат ожидаемые значения, и что ваши условия и циклы выполняются правильно.

3. Ручное тестирование: Попробуйте привести различные наборы входных данных и проверьте, как ваш код обрабатывает эти случаи. Проверьте, что ваш алгоритм работает верно для всех возможных крайних случаев.

Если после этого вы все еще не можете найти ошибку, попробуйте обратиться за помощью на форуме или там, где вы нашли эту задачу, чтобы другие программисты могли помочь вам найти проблему в вашем коде.
Edgar Po
Edgar Po
650