Tugasnya adalah sebagai berikut. Diberikan bilangan bulat x
(sedemikian rupa sehingga x
modulo 100000000003
tidak sama dengan 0
) yang disajikan ke kode Anda dengan cara apa pun yang Anda rasa nyaman, hasilkan bilangan bulat lain y < 100000000003
sehingga (x * y) mod 100000000003 = 1
.
Kode Anda harus memakan waktu kurang dari 30 menit untuk berjalan pada mesin desktop standar untuk setiap input x
sedemikian rupa |x| < 2^40
.
Uji kasus
Input: 400000001. Output: 65991902837
Input: 4000000001. Output: 68181818185
Input: 2. Output: 50000000002
Input: 50000000002. Output: 2.
Input: 1000000. Output: 33333300001
Batasan
Anda tidak boleh menggunakan pustaka atau fungsi bawaan apa pun yang melakukan modulo aritmatika (atau operasi terbalik ini). Ini berarti Anda bahkan tidak dapat melakukannya a % b
tanpa menerapkan %
sendiri. Anda dapat menggunakan semua fungsi built-in aritmatika non-modulo lainnya.
Pertanyaan serupa
Ini mirip dengan pertanyaan ini meskipun semoga cukup berbeda untuk tetap menarik.
100000000003
? (hanya ingin tahu)Jawaban:
Pyth, 24 byte
Suite uji
Ini menggunakan fakta bahwa a ^ (p-2) mod p = a ^ -1 mod p.
Pertama, saya secara manual menerapkan kembali modulus, untuk kasus spesifik mod 100000000003. Saya menggunakan rumus
a mod b = a - (a/b)*b
, di mana/
pembagian lantai. Saya menghasilkan modulus dengan10^11 + 3
, menggunakan kode+3^T11
, lalu menyimpannyaJ
, kemudian menggunakan rumus ini dan di atas untuk menghitung b mod 100000000003 dengan-b*/bJ+3^T11J
. Fungsi ini didefinisikan sebagaiy
denganL
.Selanjutnya, saya mulai dengan input, kemudian membawanya ke kekuatan kesepuluh dan mengurangi mod 100000000003, dan ulangi ini 11 kali.
y^GT
adalah kode yang dieksekusi di setiap langkah, danuy^GT11Q
menjalankannya 11 kali dimulai dengan input.Sekarang saya sudah
Q^(10^11) mod 10^11 + 3
, dan saya inginQ^(10^11 + 1) mod 10^11 + 3
, jadi saya kalikan dengan input dengan*
, kurangi mod 100000000003 dengan yangy
terakhir kali, dan output.sumber
Haskell ,
118113105101 byteTerinspirasi dari solusi ini .
-12 dari Ørjan Johansen
Cobalah online!
Haskell , 48 byte
Menulis ulang solusi ini . Walaupun cukup cepat untuk vektor uji, solusi ini terlalu lambat untuk input lainnya.
Cobalah online!
sumber
g
operator(e?b)a s|...
(2) Jika Anda beraliha
dans
kemudian Anda dapat membuat!
sebuah non -operator dan inliney
ke dalamnya. (3) Anda dapat menyingkirkan yang mahalwhere
denganlast
trik, dengan biaya duplikasiz
. Cobalah online!|e==0=a
singkirkan duplikasi sial itu.Brachylog , 22 byte
Cobalah online!
Ini membutuhkan waktu sekitar 10 menit untuk
1000000
dengan versi kode yang sedikit berbeda (dan lebih lama) yang persis dua kali lebih cepat (hanya memeriksa nilai positifİ
alih-alih positif dan negatif). Karenanya ini membutuhkan waktu sekitar 20 menit untuk menyelesaikan input tersebut.Penjelasan
Kami hanya menjelaskan itu
Input × Output - 1 = 100000000003 × an integer
, dan biarkan aritmatika kendala menemukanOutput
bagi kita.Kami secara teknis tidak memerlukan pelabelan eksplisit
≜
, namun jika kami tidak menggunakannya,~×
tidak akan memeriksa kasusN = [100000000003,1]
(karena sering tidak berguna), artinya ini akan sangat lambat untuk input2
misalnya karena akan perlu menemukan bilangan bulat terkecil kedua bukan yang pertama.sumber
İ
, jadi ini masih sangat lambat untuk produk besar.Python,
535149585349 byte-2 bytes berkat orlp
-2 bytes berkat officialaimm
-4 bytes berkat Felipe Nardi Batist
-3 bytes berkat isaacg
-1 byte berkat Ørjan Johansen
-2 bytes berkat Federico Poloni
Cobalah secara Online!
Butuh saya ~ 30 menit untuk menemukan yang ini. Solusi saya adalah mulai dengan angka pertama yang akan mod ke 1. Angka ini adalah 1. Jika dapat dibagi dengan x, maka y adalah angka yang dibagi dengan x. Jika tidak, tambahkan 10000000003 ke nomor ini untuk menemukan angka kedua yang mod 1000000003 akan sama dengan 1 dan ulangi.
sumber
421385994
waktu yang keluar.b
hanya perlu sekali, mengapa tidak melakukan hardcoding?JavaScript (ES6),
153143141 byteTerinspirasi oleh jawaban ini dari math.stackexchange.com .
Fungsi rekursif berdasarkan algoritma Euclidean.
Modulo diimplementasikan dengan komputasi:
Karena hasil bagi juga diperlukan, melakukannya dengan cara yang sebenarnya masuk akal.
Uji kasus
Tampilkan cuplikan kode
sumber
C ++ 11 (GCC / Dentang, Linux),
104102 bytehttps://ideone.com/gp41rW
Tidak digubah, berdasarkan teorema Euler dan eksponen biner.
sumber
long
paling tidak 32-bit, jadi tidak harus selalu berlaku1e11 + 3
. Ini 32-bit pada Windows x86-64.long
adalah tipe 64-bit pada x86-64 Linux (dan OS lain yang menggunakan SystemV ABI). Jadi untuk sepenuhnya portabel, Anda harus menggunakanlong long
, yang dijamin setidaknya 64-bit sejak C ++ 11 .__int128_t
tampaknya tidak menjadi standar C ++, tampaknya merupakan ekstensi gcc, akan lebih keren jika Anda menyatakan ini sebagai bahasa (C ++ 11 + gcc).Mathematica, 49 byte
sumber
PHP, 71 byte
Testcases
sumber
Ruby , 58 byte
Menggunakan aplikasi isaacg tentang teorema kecil Fermat untuk saat ini sementara saya menyelesaikan pengaturan waktu solusi brute-force.
Versi kekerasan saat ini, yang 47 byte tapi
mungkinadalah terlalu lambat:Cobalah online!
sumber