Zadanie jest następujące. Biorąc pod uwagę liczbę całkowitą x
(taką, że x
modulo 100000000003
nie jest równe 0
) przedstawioną w kodzie w dowolny dogodny sposób, wypisz kolejną liczbę całkowitą y < 100000000003
, aby (x * y) mod 100000000003 = 1
.
Kod musi trwać krócej niż 30 minut, aby uruchomić się na standardowym komputerze stacjonarnym dla każdegox
takiego wejścia |x| < 2^40
.
Przypadki testowe
Wejście: 400000001. Wyjście: 65991902837
Wejście: 4000000001. Wyjście: 68181818185
Wejście: 2. Wyjście: 50000000002
Wejście: 50000000002. Wyjście: 2.
Wejście: 1000000. Wyjście: 33333300001
Ograniczenia
Nie wolno używać żadnych bibliotek ani wbudowanych funkcji, które wykonują arytmetykę modulo (lub tę odwrotną operację). Oznacza to, że nie możesz się obejść a % b
bez wdrożenia %
się. Możesz jednak użyć wszystkich innych niemodulo modulowanych wbudowanych funkcji arytmetycznych.
Podobne pytanie
Jest to podobne do tego pytania, choć, mam nadzieję, na tyle różne, że nadal będzie interesujące.
100000000003
? (tylko się zastanawiam)Odpowiedzi:
Pyth, 24 bajty
Zestaw testowy
Wykorzystuje to fakt, że mod ^ (p-2) p = mod ^ ^ p.
Najpierw ręcznie reimplementuję moduł, dla konkretnego przypadku mod 100000000003. Używam wzoru
a mod b = a - (a/b)*b
, w którym/
jest dzielenie zmiennoprzecinkowe. Generuję moduł za10^11 + 3
pomocą, używając kodu+3^T11
, a następnie zapisuję goJ
, a następnie używam tej i powyższej formuły do obliczenia b mod 100000000003 za pomocą-b*/bJ+3^T11J
. Funkcja ta jest określona jakoy
wL
.Następnie zaczynam od wejścia, następnie doprowadzam do dziesiątej mocy i redukuję mod 100000000003, i powtarzam to 11 razy.
y^GT
to kod wykonywany na każdym kroku iuy^GT11Q
uruchamia go 11 razy, zaczynając od danych wejściowych.Teraz mam
Q^(10^11) mod 10^11 + 3
i chcęQ^(10^11 + 1) mod 10^11 + 3
, więc mnożę przez dane wejściowe*
, redukuję to mod 100000000003y
po raz ostatni i generuję.źródło
Haskell ,
118113105101 bajtówInspirowane tym rozwiązaniem .
-12 od Ørjan Johansen
Wypróbuj online!
Haskell , 48 bajtów
Przepisz to rozwiązanie . Chociaż jest wystarczająco szybki dla wektora testowego, to rozwiązanie jest zbyt wolne dla innych wejść.
Wypróbuj online!
źródło
g
operator(e?b)a s|...
(2) Jeśli włączeniua
as
następnie można zrobić!
to non -operator i inliney
do niego. (3) Można pozbyć się drogiwhere
przezlast
podstęp, kosztem powielaniaz
. Wypróbuj online!|e==0=a
pozbywam się tego nieznośnego powielania.Brachylog , 22 bajty
Wypróbuj online!
Zajęło to około 10 minut w
1000000
przypadku nieco innej (i dłuższej) wersji kodu, która była dokładnie dwa razy szybsza (sprawdzono tylko wartości dodatnieİ
zamiast zarówno dodatnich, jak i ujemnych). Dlatego wypełnienie tego wpisu powinno zająć około 20 minut.Wyjaśnienie
Po prostu to opisujemy
Input × Output - 1 = 100000000003 × an integer
i pozwólOutput
nam znaleźć arytmetykę ograniczeń .Technicznie nie potrzebujemy wyraźnego etykietowania
≜
, jednak jeśli go nie użyjemy,~×
nie sprawdzi obudowyN = [100000000003,1]
(ponieważ często jest to bezużyteczne), co oznacza, że będzie to bardzo powolne2
na przykład wprowadzanie danych, ponieważ będzie musiało znaleźć drugą najmniejszą liczbę całkowitą zamiast pierwszego.źródło
İ
, więc jest to wciąż dość wolne w przypadku dużych produktów.Python,
535149585349 bajtów-2 bajty dzięki orlp
-2 bajty dzięki Officialaimm
-4 bajty dzięki Felipe Nardi Batist
-3 bajty dzięki isaacg
-1 bajt dzięki Ørjan Johansen
-2 bajty dzięki Federico Poloni
Wypróbuj online!
Rozpracowanie tego zajęło mi około 30 minut. Moim rozwiązaniem jest zacząć od pierwszej liczby, która zmieni się na 1. Ta liczba to 1. Jeśli jest podzielna przez x, to y jest liczbą podzieloną przez x. Jeśli nie, dodaj 10000000003 do tego numeru, aby znaleźć drugą liczbę, której mod 1000000003 będzie równy 1 i powtórz.
źródło
421385994
które czasy minęły.b
tylko raz, dlaczego nie zakodować na stałe?JavaScript (ES6),
153143141 bajtówZainspirowany tą odpowiedzią od math.stackexchange.com .
Funkcja rekurencyjna oparta na algorytmie euklidesowym.
Modulo jest realizowane przez obliczenia:
Ponieważ iloraz jest również potrzebny, robienie tego w ten sposób ma sens.
Przypadki testowe
Pokaż fragment kodu
źródło
C ++ 11 (GCC / Clang, Linux),
104102 bajtówhttps://ideone.com/gp41rW
Niegolfowany, oparty na twierdzeniu Eulera i potęgowaniu binarnym.
źródło
long
co najmniej 32-bitowego, więc niekoniecznie musi się trzymać1e11 + 3
. Jest 32-bitowy w systemie Windows x86-64.long
jest 64-bitowym typem w systemie Linux x86-64 (i innych systemach operacyjnych, które używają SystemV ABI). Aby być w pełni przenośnym, musisz użyćlong long
, co gwarantuje, że jest co najmniej 64-bitowe od C ++ 11 .__int128_t
nie wydaje się być standardowym C ++, wydaje się być rozszerzeniem gcc, byłoby fajnie, gdybyś określił to jako język (C ++ 11 + gcc).Mathematica, 49 bajtów
źródło
PHP, 71 bajtów
Przypadki testowe
źródło
Rubinowy , 58 bajtów
Na razie wykorzystuje isaacgowskie małe twierdzenie Fermata, podczas gdy ja kończę mierzenie rozwiązania brutalnej siły.
Aktualna wersja brute force, która wynosi 47 bajtów, lecz
może byćto zbyt wolno:Wypróbuj online!
źródło