Deskripsi tantangan
Untuk setiap bilangan bulat positif n
terdapat bilangan yang bentuknya 111...10...000
dapat dibagi dengan n
bilangan desimal yang dimulai dengan semua 1
dan diakhiri dengan semua 0
. Ini sangat mudah dibuktikan: jika kita mengambil satu set n+1
angka yang berbeda dalam bentuk 111...111
(semuanya 1
), maka setidaknya dua dari mereka akan memberikan sisa yang sama setelah pembagian dengan n
(sesuai prinsip pigeonhole). Perbedaan dari dua angka ini akan habis dibagi n
dan akan memiliki bentuk yang diinginkan. Tujuan Anda adalah menulis program yang menemukan nomor ini.
Deskripsi input
Bilangan bulat positif.
Deskripsi keluaran
Sejumlah p
dalam bentuk 111...10...000
, sedemikian rupa p ≡ 0 (mod n)
. Jika Anda menemukan lebih dari satu - tampilkan salah satunya (tidak perlu yang terkecil).
Catatan
Program Anda harus memberikan jawaban dalam jumlah waktu yang wajar. Yang berarti pemaksaan kasar tidak diizinkan:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
Tidak juga ini:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
Iterasi melalui angka-angka dalam bentuk 11..10..00
diperbolehkan.
Program Anda tidak perlu menangani input besar sembarang - batas atas adalah apa pun batas atas bahasa Anda.
Output sampel
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
sumber
1
dan setidaknya satu0
, jika tidak,0
merupakan solusi untuk setiap input. (Akan lebih baik untuk mengklarifikasi ini.)1
harus bekerja.Jawaban:
Mathematica, 29 byte
Kode oleh Martin Büttner .
Input
n
, output ini jumlah dengan9*ϕ(n)
yang diikuti olehn
nol, di manaϕ
adalah fungsi totient Euler . Dengan suatu fungsiphi
, ini bisa diekspresikan dalam Python sebagaiCukuplah menggunakan faktorial
n!
sebagai gantiϕ(n)
, tetapi mencetak banyak yang tidak memiliki jangka waktu yang wajar.Klaim:
9*ϕ(n)
yang diikuti olehn
nol adalah kelipatan darin
.Bukti: Pertama, mari kita buktikan ini untuk kasus yang
n
bukan kelipatan dari2
,3
atau5
. Kami akan menunjukkan nomor dengan yang terdiri dariϕ(n)
kelipatan `n.Jumlah yang dibuat
k
sama dengan(10^k-1)/9
. Karenan
bukan kelipatan3
, ini merupakan kelipatann
selama10^k-1
merupakan faktorn
, atau jika setara10^k = 1 (mod n)
. Perhatikan bahwa formulasi ini membuat jelas bahwa jikak
berfungsi untuk jumlah yang, maka demikian juga kelipatannyak
.Jadi, kami sedang mencari
k
untuk menjadi kelipatan dari urutan darik
dalam perkalian kelompok modulo n . Menurut Teorema Lagrange , urutan seperti itu adalah pembagi ukuran grup. Karena unsur-unsur kelompok adalah jumlah dari1
ken
yang relatif prima untukn
, ukurannya adalah fungsi totient Eulerϕ(n)
. Jadi, kami telah menunjukkan itu10^ϕ(n) = 1 (mod n)
, dan jumlah yang dibuatϕ(n)
adalah kelipatan dari `n.Sekarang, mari kita tangani faktor-faktor potensial dari
3
dalamn
. Kita tahu itu10^ϕ(n)-1
kelipatann
, tetapi(10^ϕ(n)-1)/9
mungkin tidak. Tapi,(10^(9*ϕ(n))-1)/9
adalah kelipatan9
karena terdiri dari9*ϕ(n)
yang, jadi jumlah digitnya kelipatan9
. Dan kami mencatat bahwa mengalikan eksponenk
dengan konstanta menjaga keterbagian.Sekarang, jika
n
memiliki faktor2
's dan5
' s, kita perlu menambahkan nol ke akhir output. Itu jauh lebih dari cukup untuk menggunakann
nol (sebenarnyalog_2(n)
akan dilakukan). Jadi, jika input kitan
dipecah menjadin = 2^a * 5^b * m
, itu sudah cukup untuk memiliki9*ϕ(m)
satu untuk menjadi kelipatann
, dikalikan dengan10^n
menjadi kelipatan2^a * 5^b
. Dan, karenan
merupakan kelipatanm
, itu sudah cukup untuk menggunakannya9*ϕ(n)
. Jadi, berfungsi untuk memiliki9*ϕ(n)
yang diikuti olehn
nol.sumber
EulerPhi
fungsi bawaan. Tidak ada yang mengejutkan bagi implementasi yang sebenarnya, jadi saya akan menganggap ini sepenuhnya pekerjaannya sendiri.Python 2, 44 byte
Ketika
j
kekuatan 10 seperti 1000, divisi-lantaij/9
memberikan angka yang terbuat dari 1 seperti 111. Jadi,j/9*j
memberi 1 diikuti dengan jumlah yang sama dengan 0 seperti 111000.Fungsi secara rekursif menguji angka dari formulir ini, mencoba kekuatan yang lebih tinggi dan lebih tinggi dari 10 hingga kami menemukan satu yang merupakan kelipatan dari angka yang diinginkan.
sumber
Pyth, 11 byte
Suite uji
Pada dasarnya, itu hanya menempatkan 1 di depan dan 0 di belakang lagi dan lagi sampai jumlahnya habis oleh input.
Penjelasan:
sumber
Haskell, 51 byte
Menggunakan pendekatan xnor. nimi menyimpan satu byte!
sumber
CJam,
282519 byteDisimpan 6 byte dengan pengamatan xnor bahwa kita hanya perlu melihat nomor formulir .
1n0n
Uji di sini.
Penjelasan
sumber
Mathematica,
14055 byteBanyak byte yang dihapus berkat trik 1 ^ n0 ^ n xnor.
Nilai minimal,
140156 byte Ini memberikan solusi sekecil mungkin.Ini menghitung berapa banyak nol yang diperlukan kemudian memeriksa semua
1
jumlah yang mungkin sampai berfungsi. Ini bisa menampilkan angka tanpa 0 tetapi itu bisa diperbaiki dengan menambahkan<>"0"
hak sebelum final&
.sumber
Haskell, 37 byte
Ini menggunakan fakta bahwa ia berfungsi untuk memilikinya
9*phi(n)
, di manaphi
fungsi totient Euler. Di sini, ini diterapkan menggunakangcd
dan memfilter, menghasilkan satu digit untuk setiap nilaii
yang relatif prima untuk itu yang berada dalam kisaran1
dan9*n
. Ini juga cukup untuk menggunakan banyak nol ini.sumber
JavaScript (ES6), 65 byte
Edit 2 byte yang disimpan thx @Neil
Ia bekerja dalam batas tipe numerik javascript, dengan 17 digit signifikan. (Sangat terbatas)
Kurang golf
sumber
for(m=n;
?for(m=n;!m[16];)if(!((m+=0)%a))
.Perl 5, 26 byte
termasuk byte untuk
-n
(-M5.01
gratis)sumber
Sage, 33 byte
Ini menggunakan metode xnor untuk menghasilkan output.
Cobalah online
sumber
bc, 58 byte
Contoh hasil
sumber
dc, 27 byte
Ini mendefinisikan fungsi
f
yang mengharapkan argumennya dalam variabeln
. Untuk menggunakannya sebagai program,?sn lfx p
untuk membaca dari stdin, panggil fungsi, dan cetak hasilnya ke stdout. Variabelm
dan atas tumpukan harus diatur ulang ke 10 (dengan mengulangiOdsm
) sebelumf
dapat digunakan kembali.Hasil:
sumber