Задача заключается в следующем. Дано целое число x
(например , что по x
модулю 100000000003
не равно 0
) представлены коду в любом случае вы найдете удобными, выходное другое целое число , y < 100000000003
так что (x * y) mod 100000000003 = 1
.
Ваш код должен занять менее 30 минут для запуска на стандартном настольном компьютере для любого ввода, x
такого как |x| < 2^40
.
Контрольные примеры
Вход: 400000001. Выход: 65991902837
Ввод: 4000000001. Выход: 68181818185
Вход: 2. Выход: 50000000002
Вход: 50000000002. Выход: 2.
Вход: 1000000. Выход: 33333300001
ограничения
Вы не можете использовать какие-либо библиотеки или встроенные функции, выполняющие арифметику по модулю (или эту обратную операцию). Это означает, что вы даже не можете обойтись a % b
без реализации %
себя. Однако вы можете использовать все другие встроенные функции без модуля арифметики.
Подобный вопрос
Это похоже на этот вопрос, хотя, надеюсь, достаточно отличается, чтобы все еще представлять интерес.
100000000003
? (просто интересно)Ответы:
Pyth, 24 байта
Тестирование
Это использует тот факт, что ^ (р-2) мод р = а ^ -1 мод р.
Во-первых, я вручную переопределяю модуль, для конкретного случая мода 100000000003. Я использую формулу
a mod b = a - (a/b)*b
, где/
находится этажное деление. Я генерирую модуль с10^11 + 3
помощью кода+3^T11
, затем сохраняю егоJ
, затем использую эту и приведенную выше формулу для вычисления b mod 100000000003 с-b*/bJ+3^T11J
. Эта функция определяется какy
сL
.Далее я начинаю со входа, затем поднимаю его до десятой степени и уменьшаю мод до 100000000003, и повторяю это 11 раз.
y^GT
код, выполняемый на каждом шаге, иuy^GT11Q
запускает его 11 раз, начиная с ввода.Теперь у меня есть
Q^(10^11) mod 10^11 + 3
, и я хочуQ^(10^11 + 1) mod 10^11 + 3
, поэтому я умножить на вход с*
, уменьшить его мод 100000000003 сy
одним последним разом, и вывод.источник
Haskell ,
118113105101 байтВдохновлен этим решением .
-12 от Орьяна Йохансена
Попробуйте онлайн!
Haskell , 48 байтов
Переписать это решение . Хотя это решение достаточно быстрое для тестового вектора, оно слишком медленное для других входов.
Попробуйте онлайн!
источник
g
оператор(e?b)a s|...
(2) Если при включенииa
иs
после этого вы можете сделать!
в нон -оператора и встроенныйy
в него. (3) Вы можете избавиться от дорогогоwhere
с помощьюlast
трюка, за счет дублированияz
. Попробуйте онлайн!|e==0=a
избавляется от этого надоедливого дублирования.Брахилог , 22 байта
Попробуйте онлайн!
Это заняло около 10 минут для
1000000
немного другой (и более длинной) версии кода, которая была ровно в два раза быстрее (проверял только положительные значенияİ
вместо положительных и отрицательных значений ). Поэтому для этого ввода потребуется около 20 минут.объяснение
Мы просто опишем это
Input × Output - 1 = 100000000003 × an integer
, и пусть арифметика ограничения найдетOutput
для нас.Технически нам не нужна явная маркировка
≜
, однако, если мы ее не используем,~×
мы не будем проверять регистрN = [100000000003,1]
(потому что он часто бесполезен), что означает, что это будет очень медленно для ввода,2
например, потому что ему нужно будет найти второе наименьшее целое число вместо первого.источник
İ
, так что это все еще довольно медленно для больших продуктов.Python,
535149585349 байтов-2 байта благодаря orlp
-2 байта благодаря officialaimm
-4 байта благодаря Фелипе Нарди Батисту
-3 байта благодаря isaacg
-1 байту благодаря Орджану Йохансену
-2 байта благодаря Федерико Полони
Попробуйте онлайн!
Мне потребовалось ~ 30 минут, чтобы понять это. Мое решение состоит в том, чтобы начать с первого числа, которое изменится на 1. Это число равно 1. Если оно делится на x, то y это число, деленное на x. Если нет, добавьте 10000000003 к этому номеру, чтобы найти второе число, мод 1000000003 будет равен 1, и повторите.
источник
421385994
время ожидания.b
только один раз, почему бы не написать это?JavaScript (ES6),
153143141 байтВдохновлен этим ответом от math.stackexchange.com .
Рекурсивная функция, основанная на евклидовом алгоритме.
Модуль по модулю реализуется с помощью вычислений:
Поскольку коэффициент также необходим, то делать это таким образом действительно имеет смысл.
Контрольные примеры
Показать фрагмент кода
источник
C ++ 11 (GCC / Clang, Linux),
104102 байтаhttps://ideone.com/gp41rW
Ungolfed, основанный на теореме Эйлера и двоичном возведении в степень.
источник
long
должен быть не менее 32-битным, поэтому он не может быть обязательным1e11 + 3
. Это 32-битный на x86-64 Windows.long
это 64-битный тип в x86-64 Linux (и других ОС, использующих SystemV ABI). Таким образом, чтобы быть полностью переносимым, вам нужно использоватьlong long
, который гарантированно будет как минимум 64-битным начиная с C ++ 11 .__int128_t
не кажется стандартным C ++, это, кажется, расширение gcc, было бы здорово, если бы вы указали это как язык (C ++ 11 + gcc).Mathematica, 49 байтов
источник
PHP, 71 байт
Testcases
источник
Рубин , 58 байт
Пока пользуется приложением Исаака маленькой теоремы Ферма, пока я заканчиваю выбор времени для решения грубой силы.
Текущая версия перебором, которая составляет 47 байт , но
может бытьэто слишком медленно:Попробуйте онлайн!
источник