Opis wyzwania
Dla każdej dodatniej liczby całkowitej n
istnieje liczba, której postać 111...10...000
jest podzielna przez n
np. Liczbę dziesiętną, która zaczyna się od wszystkich 1
, a kończy na wszystkich 0
. Jest to bardzo łatwe do udowodnienia: jeśli weźmiemy zestaw n+1
różnych liczb w postaci 111...111
(wszystkich 1
), to co najmniej dwie z nich podadzą tę samą resztę po podzieleniu przez n
(zgodnie z zasadą szufladki). Różnica tych dwóch liczb będzie podzielna przez n
i będzie miała pożądaną formę. Twoim celem jest napisanie programu, który znajdzie ten numer.
Opis wejściowy
Dodatnia liczba całkowita.
Opis wyników
Liczba p
w postaci 111...10...000
takiej, że p ≡ 0 (mod n)
. Jeśli znajdziesz więcej niż jeden - wyświetl dowolny z nich (nie musi być najmniejszy).
Uwagi
Twój program musi udzielić odpowiedzi w rozsądnym czasie. Co oznacza, że brutalne wymuszanie jest niedozwolone:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
To też nie jest:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
Iterowanie po liczbach w postaci 11..10..00
jest dozwolone.
Twój program nie musi obsługiwać dowolnie dużych danych wejściowych - górna granica jest równa górnej granicy twojego języka.
Przykładowe wyniki
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
źródło
1
najmniej jeden0
, w przeciwnym razie0
jest to rozwiązanie dla każdego wejścia. (Dobrze by to jednak wyjaśnić.)1
powinno działać.Odpowiedzi:
Mathematica, 29 bajtów
Kod autorstwa Martina Büttnera .
Na wejściu
n
, to wyświetla liczbę z9*ϕ(n)
nich następnien
zer, gdzieϕ
pada funkcja totient Eulera . Za pomocą funkcjiphi
można to wyrazić w Pythonie jakoWystarczy użyć silni
n!
zamiastϕ(n)
, ale drukowanie wielu nie ma rozsądnego czasu działania.Twierdzenie: zera
9*ϕ(n)
pon
zerach to wielokrotnośćn
.Dowód: Najpierw udowodnić to na wypadek, że
n
nie jest wielokrotnością2
,3
lub5
. Pokażemy, że liczba składająca się zϕ(n)
nich jest wielokrotnością `n.Ich liczba
k
jest równa(10^k-1)/9
. Ponieważn
nie jest wielokrotnością3
, jest to wielokrotnośćn
tak długa, jak10^k-1
współczynnikn
lub równoważnie jeśli10^k = 1 (mod n)
. Zauważ, że to sformułowanie pokazuje, że jeślik
działa dla wielu, to robi to dowolna wielokrotnośćk
.Więc szukamy
k
być wielokrotnością kolejności odk
w multiplikatywnego grupa modulo n . Zgodnie z twierdzeniem Lagrange'a każda taka kolejność jest dzielnikiem wielkości grupy. Ponieważ elementami grupy są liczby od1
do,n
które są względnie pierwsze don
, jej rozmiar jest funkcją sumaryczną Euleraϕ(n)
. Tak więc pokazaliśmy to10^ϕ(n) = 1 (mod n)
, a więc ich liczbaϕ(n)
jest wielokrotnością `n.Teraz zajmiemy się potencjalnymi czynnikami
3
wn
. Wiemy, że10^ϕ(n)-1
jest to wielokrotnośćn
, ale(10^ϕ(n)-1)/9
może nie być. Ale(10^(9*ϕ(n))-1)/9
jest wielokrotnością,9
ponieważ składa się z9*ϕ(n)
nich, więc suma jego cyfr jest wielokrotnością9
. Zauważyliśmy, że pomnożenie wykładnikak
przez stałą zachowuje podzielność.Teraz, jeśli
n
ma czynniki2
's i5
', musimy dodać zera na końcu wyniku. Jest to o wiele więcej niż wystarczające do używanian
zer (w rzeczywistościlog_2(n)
by to zrobił). Tak więc, jeśli nasze dane wejściowen
są podzielone jakon = 2^a * 5^b * m
, wystarczy9*ϕ(m)
, aby były one wielokrotnościąn
, pomnożone przez10^n
wielokrotność2^a * 5^b
. A ponieważn
jest to wielokrotnośćm
, wystarczy użyć9*ϕ(n)
tych. Więc działa tak, aby po9*ϕ(n)
nich byłyn
zera.źródło
EulerPhi
funkcję. Rzeczywista realizacja nie jest oszałamiająca, więc rozważę to w pełni jego własną pracę.Python 2, 44 bajty
Gdy
j
jest potęga 10, taka jak 1000, podział na piętraj/9
daje liczbę złożoną z 1, takich jak 111. Zatemj/9*j
daje 1, a następnie równą liczbę zer, takich jak 111000.Funkcja rekurencyjnie testuje liczby w tej formie, próbując coraz wyższych potęg 10, dopóki nie znajdziemy takiej, która jest wielokrotnością żądanej liczby.
źródło
Pyth, 11 bajtów
Zestaw testowy
Zasadniczo po prostu umieszcza 1 z przodu i 0 z powrotem w kółko, aż liczba będzie podzielna przez dane wejściowe.
Wyjaśnienie:
źródło
Haskell, 51 bajtów
Korzystanie z podejścia xnor. nimi uratował bajt!
źródło
CJam,
282519 bajtówZaoszczędziłem 6 bajtów z obserwacją xnora, że wystarczy spojrzeć na liczby w formularzu .
1n0n
Sprawdź to tutaj.
Wyjaśnienie
źródło
Mathematica,
14055 bajtówUsunięto wiele bajtów dzięki sztuczce xnor 1 ^ n0 ^ n.
Minimalna wartość,
140156 bajtów To daje najmniejsze możliwe rozwiązanie.Oblicza, ile zer jest wymaganych, a następnie sprawdza wszystkie możliwe
1
liczby, aż zadziała. Może wypisać liczbę bez 0, ale można to naprawić, dodając<>"0"
prawo przed końcem&
.źródło
Haskell, 37 bajtów
Wykorzystuje to fakt , że działa tak, aby mieć
9*phi(n)
takie, gdziephi
jest funkcja sumująca Eulera. Tutaj jest implementowany za pomocągcd
i filtrowania, generując jedną cyfrę dla każdej wartości,i
która jest względnie pierwotna w zakresie1
i9*n
. Wystarczy również użyć tak wielu zer.źródło
JavaScript (ES6), 65 bajtów
Edytuj 2 bajty zapisane thx @ Neil
Działa w granicach typu liczbowego javascript, z 17 cyframi znaczącymi. (Tak dość ograniczony)
Mniej golfa
źródło
for(m=n;
?for(m=n;!m[16];)if(!((m+=0)%a))
.Perl 5, 26 bajtów
zawiera bajt dla
-n
(-M5.01
jest bezpłatny)źródło
Sage, 33 bajty
Używa metody xnor do generowania danych wyjściowych.
Wypróbuj online
źródło
bc, 58 bajtów
Przykładowe wyniki
źródło
dc, 27 bajtów
Definiuje funkcję,
f
która oczekuje argumentu w zmiennejn
. Aby użyć go jako programu,?sn lfx p
do odczytu ze standardowego wejścia, wywołaj funkcję i wydrukuj wynik na standardowe wyjście. Zmiennam
i górna część stosu muszą zostać zresetowane do 10 (powtarzającOdsm
), zanimf
będzie można ich ponownie użyć.Wyniki:
źródło