(Вычеркнуто 44 все еще 44.) Спасибо Fireflame241 за сохранение байта!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Попробуйте онлайн!
Существует ровно один номер между 0и P-1который является обратным 10. Но если этот обратный uслучай больше, чем P/2, то (u-P)он также обратный, и имеет меньшее абсолютное значение, чем u. Вот и получается, что мы действительно ищем уникальный номерx между -P/2и P/2который является обратным к 10.
Код выше делает именно это, начиная с (этажа) P/2и спускаясь вниз, пока не будет достигнут обратный. Это должно произойти для некоторого числа больше, чем -P/2до тех пор, Pпока простое число больше, чем 10. Точнее, оно прекратится тогда и только тогда, когдаP это взаимно 10.
Изменить: На самом деле оказывается, что xгарантированно находится между -P/3и P/3, поэтому текущая версия начинается сP/3 и оттуда вниз. См. Раздел « Улучшенная граница» для объяснения этого.
Математическое объяснение
Для меня не сразу было очевидно, почему тест делимости работает. Вот объяснение, на случай, если кому-то еще будет интересно.
Позвольте Pбыть простое число, больше, чем 10, чья последняя цифра b. таким образом
P = 10a + b
где a > 0и 0 <= b < 10. На самом деле bлибо 1, 3, 7, или 9, так как простое число , большее 10должно заканчиваться в одной из этих цифр.
Теперь предположим bx + a = 0 (mod P). потом
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Поскольку Pпростое число, целые числа mod Pявляются интегральной областью . Так что либоb = 0 (mod P) , либо 1 - 10x = 0 (mod P).
Мы знаем 0 <= b < 10 < P, так что если b = 0 (mod P)тогда b = 0. Но мы сказали , bлибо 1, 3, 7, или 9, так что это невозможно. Поэтому 1 - 10x = 0 (mod P)так 10x = 1 (mod P). Другими словами, xэто обратное 10, по модулюP .
Теперь предположим, что Nэто неотрицательное целое число, последняя цифра которого d, поэтому у N = 10c + d. нас есть цепочка эквивалентных утверждений:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Полезность?
Мне также было интересно, будет ли тест делимости (задан N = 10c + d, заменен Nна dx + c) действительно продуктивным на практике. Или, по крайней мере, надежно ли заменить Nна число меньше, чемN (в абсолютном значении)?
Предположим N = 10c + d, где c >= 0и 0 <= d < 10. Поэтому 10c = N - d <= N. По неравенству треугольника,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Таким образом, если 5P <= 9N/10, тогда |c + dx| < N.
В частности, если N >= 6P, то |c + dx| < N. Таким образом, учитывая , Pмы начнем с расчета 2P, 3P..., 6Pнаряду с x. Затем дается N, мы проводим тест делимостных несколько раз , пока мы не достигнем числа меньше или равно 6P, и проверить , является ли результат любой из чисел 0, P, 2P..., 6P.
(Конечно, всякий раз, когда мы достигаем отрицательного числа, мы заменяем его его абсолютным значением, что хорошо, так qкак делится на Pто и только если (-q)есть.)
Улучшенная граница
Я заметил, что |x|/Pникогда не казалось близким 1/2. На самом деле казалось, что это всегда было меньше 1/3... или, при ближайшем рассмотрении, это всегда было очень близко к 1/10или 3/10. Самым большим, что он когда-либо получал 4/13(что случается, когда P=13и x=4). С чего бы это?
Позвольте uбыть целым числом и предположим, что 10u = kP + 1для некоторого целого k, так uчто обратное 10, по модулю P. Тогда мы также знаем, что kэто относительно простое число 10, так k(-P)как эквивалентно по 1модулю 10.
Теперь мы знаем, что все обратные по 10модулю Pотличаются на кратные P, поэтому мы можем взять целое число uи либо добавить, либо вычесть кратные Pпо желанию, и результат всегда будет обратным к 10модулю P. Предположим, мы решили вычесть Pиз u: мы получаем
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Другими словами, уменьшение (соответственно увеличение) uна Pсоответствует уменьшению (увеличению) kна 10. Мы хотим добавить / вычесть кратные Pот uдо тех пор, пока левая часть не будет минимизирована по абсолютной величине; но левая сторона минимизируется именно тогда, когда правая сторона минимизирована, и поэтому мы хотим добавить / вычесть 10изk пока правая рука не сворачивается в абсолютной величине.
Но мы знаем , что это произойдет , когда kмежду -5и 5, и , следовательно , (так как kвзаимно простое с 10) это означает , что kлибо -3, -1, 1или 3. (Это содержание комментария @ Neil к OP. Спасибо, Neil! )
Таким образом , когда |u|минимизируется (т.е. u=x), мы будем иметь x/P = u/P = k/10 + 1/(10P), где kлибо -3, -1, 1или 3. Поэтому |x|/P <= 3/10 + 1/(10P). Эквивалентно |x| <= (3P + 1)/10.
Далее, это неравенство строгое P=11, потому что у P=11нас есть x=-1и k=-1. Наименьшее, Pдля которого выполняется равенство P=13(где x=4и k=3).
Поэтому самое большое, что |x|/Pкогда-либо получается 3/10 + 1/(10*13), это потому, что P=13это первое простое число, для которого мы имеем k=3, и среди тех, у кого k=3этот 1/(10P)термин самый большой, когда Pон наименьший (т. Е. At P=13). Поэтому для всех Pу нас тоже есть |x|/P <= 3/10 + 1/130 = 4/13 < 1/3. Это объясняет, почему в приведенном выше коде мы можем инициализировать, i = P/3а не начинать с P/2.
Кроме того, теперь можно улучшить границы в разделе « Полезность » выше.
Лемма : давай N = 10c + dгде c > 0и 0 <= d <= 9. Потом c + d|x| < N/10 + 9(3P + 1)/10. (Обратите внимание на строгое неравенство.)
Доказательство леммы: по случаям. Дело I: d = 0так N = 10c. Потом c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10.
Случай II 0 < d <= 9. Тогда 10c = N - d < Nтак c < N/10. Следовательноc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10 . QED.
Таким образом, если N > 3P(и N = 10c + dкак прежде), то
3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
Так что, если N > 3Pтогда c + d|x| < N.
Таким образом, мы имеем только , чтобы найти P, 2Pи 3P, наряду с x. Учитывая N > 0, в то время как N > 3Pмы заменим Nна |c + dx|, который уменьшается N. В конце концов мы получим N <= 3P; в этой точке мы останавливаемся и проверить , является ли Nравно ни одному из чисел 0, P, 2P, или 3P.
Мы не можем сделать лучше, чем 3Pв целом. Например, предположим, P = 13и N = 39так x = 4. Затем замена Nна dx + c = 9(4) + 3листья Nбез изменений.
xпо абсолютной величине значение,10*x-1которое делится на входные данные.