Diberi nilai prima P
lebih besar dari itu 10
, program atau fungsi Anda harus mencari tahu aturan pembagiannya x
, yang didefinisikan sebagai bilangan bulat dengan nilai absolut terkecil yang menghasilkan kelipatan dari prime asli ketika dikalikan dengan digit terakhir dari prime dan ditambahkan ke sisa aslinya utama.
Contoh
Diberikan input 31
, digit terakhir adalah 1
dan sisanya nomor tersebut 3
. Dengan demikian program Anda harus menemukan integer x
dengan nilai absolut minimum sedemikian rupa sehingga 1*x + 3
merupakan kelipatan 31
. Dalam hal ini, x=-3
berfungsi, sehingga program atau fungsi akan kembali -3
.
Diberikan input 1000003
, digit terakhir adalah 3
dan sisanya nomor tersebut 100000
. Dengan demikian program Anda akan menemukan x=300001
karena 3*300001+100000 = 1000003
yang merupakan kelipatan 1000003
.
Latar Belakang Matematika
Nilai x
dapat digunakan sebagai tes keterbagian. Jika angka N
dapat dibagi dengan P
, kemudian menambahkan x
kali digit terakhir dari N
sisanya N
akan menghasilkan kelipatan P
jika dan hanya jika N
dapat dibagi dengan P
di tempat pertama.
Karena P=11
, kita dapatkan x=-1
, yang setara dengan aturan pembagian yang terkenal untuk 11
: angka dapat dibagi dengan 11
selisih selisih digitnya dapat dibagi 11
.
Aturan
- Output mungkin dalam bentuk apa pun yang secara jelas mengkodekan tanda dan nilai output.
- Input prima akan berada di antara 10 dan 2 ^ 30.
- Anda tidak perlu menangani jika inputnya tidak prima atau tidak dalam jangkauan.
- Anda tidak perlu menangani jika keduanya
x
dan-x
merupakan output yang valid (tidak boleh terjadi). - Brute force diizinkan, tetapi solusi yang lebih kreatif dihargai.
- Ini adalah kode-golf , sehingga kode terpendek dalam setiap bahasa menang! Jangan biarkan jawaban dalam bahasa golf menghalangi Anda untuk memposting dalam bahasa lain.
Uji Kasus
Input Output
11 -1
13 4
17 -5
19 2
23 7
29 3
31 -3
37 -11
41 -4
43 13
47 -14
53 16
59 6
61 -6
67 -20
71 -7
73 22
79 8
83 25
89 9
97 -29
101 -10
103 31
107 -32
109 11
113 34
127 -38
131 -13
1000003 300001
2000003 600001
2999999 300000
9999991 -999999
sumber
x
nilai absolut terkecil di mana10*x-1
dapat dibagi oleh input.(3 / (n % 5 * 2 - 5) * n + 1) / 10
dan(n % 5 * 2 - 5^2) * n / 10 + 1
dapat menemukan nilai absolut minimal untuk sesuatu seperti ini? Intuisi pertama saya adalah menghitung multiple paling umum menggunakan pembagi umum terbesar yang dihitung dengan algoritma Euclid.x
, menambahkannya, dan masih mendapatkan nomor yang dapat dibagin
. Jika kita mengalikan angka baru dengan 10 dan mengurangi angka aslinya, angka itu masih dapat dibagin
. Komentar xnor kemudian mengikuti dari beberapa aljabar. Langkah selanjutnya adalah mengatur ulang rumus sehingga memberikanx
dalam haln
: x =(k*n+1)/10
. Kami ingin terkecil mutlakx
jadi karena kami ingin terkecil mutlakk
, dan ini harus menjadi mana salah-3
,-1
,1
atau3
(tergantung padan
's digit terakhir) yang membuat divisi yang tepat.Jawaban:
JavaScript (ES6),
322523 byte3/(n%5*2-5)
akan ditulis9/n(mod -10)
jika saya memiliki akses ke divisi modulo seimbang. Sunting: Disimpan 2 byte berkat @EgorSkriptunoffsumber
n=>((n%10*2%14-3)*n+1)/10
dengann=>(3/(n%5*2-5)*n+1)/10
Python 2 , 27 byte
Cobalah online!
Operasi dilakukan kiri ke kanan:
(((n%5)*2)-5)^2
.Saya menggunakan forcer brit aritmatika saya untuk menemukan ekspresi
n%5*2-5^2
untuk melakukan{1:-1,3:3,2:-3,4:1}[k]
, mengambil invers negatif residu mod 5 ke dalam jangkauan[-2..2]
.sumber
3/(n%5*2-5)
Panjangnya sama dengan(n%5*2-5^2)
.)n%5*2-6^3
. Saya hanya melihat ke atas sepanjang ekspresi tanpa parens, sedangkan3/(n%5*2-5)
dua karakter lebih lama tetapi menghemat paren luar karena diutamakan. Mencari ekspresi dengan panjang ini seharusnya memakan waktu cukup lama. Kasus penggunaan ini memang menyarankan opsi untuk hanya menemukan ekspresi yang dapat digunakan dalam konteks tertentu melalui operasi terluar mereka yang memiliki prioritas yang cukup tinggi.Jelly ,
108 byteCobalah online!
Penjelasan
sumber
Brachylog , 14 byte
Cobalah online!
sumber
Python 2 ,
695453 byteEdit: -15 byte terima kasih kepada @ Mr.Xcoder
Sunting: -1 byte dengan menggunakan rekursi
Cobalah online!
sumber
Python 2 ,
31 2927 byteCobalah online!
sumber
Japt ,
169 byteTerlalu banyak byte yang disimpan berkat pengamatan oleh @xnor
Uji secara online! Butuh beberapa detik pada input yang lebih besar.
Penjelasan
sumber
Java 8,
2321 bytePelabuhan @ Neil javascrip (ES6) jawaban 's , tapi -2 byte berkat @Nevay karena lantai implisit bilangan bulat.
Coba di sini.
sumber
n->3/(n%5*2-5)*++n/10
Pyke , 12 byte
Coba di sini!
sumber
Pyth , 14 byte
Coba di sini.
sumber
Python 2 ,
4443 byte(Coret 44 masih 44.) Terima kasih kepada Fireflame241 karena telah menghemat satu byte!
Cobalah online!
Hanya ada satu angka di antara
0
danP-1
yang merupakan kebalikan dari10
. Tetapi jika kebalikan ituu
terjadi lebih besar dariP/2
, maka(u-P)
juga kebalikannya, dan memiliki nilai absolut yang lebih kecil dariu
. Jadi ternyata kami benar-benar mencari angka unik dix
antara-P/2
danP/2
yang merupakan kebalikannya10
.Kode di atas melakukan hal itu, mulai dari (lantai)
P/2
, dan melangkah ke bawah hingga kebalikannya tercapai. Ini harus terjadi untuk beberapa nomor lebih besar dari-P/2
asalkanP
prima lebih besar dari10
. Lebih tepatnya, itu akan berakhir jika dan hanya jikaP
merupakan coprime10
.Sunting: Ini sebenarnya ternyata
x
dijamin antara-P/3
danP/3
, jadi versi saat ini dimulai padaP/3
dan turun dari sana. Lihat bagian berlabel Improved Bound untuk penjelasannya.Penjelasan matematis
Tidak segera jelas bagi saya mengapa tes keterbelahan bekerja. Inilah penjelasan, kalau-kalau ada orang lain yang bertanya-tanya.
Membiarkan
P
menjadi prima, lebih besar dari10
, yang digit terakhirnya adalahb
. JadiP = 10a + b
dimana
a > 0
, dan0 <= b < 10
. Bahkanb
adalah baik1
,3
,7
, atau9
, karena lebih besar perdana dari10
keharusan akhir di salah satu digit tersebut.Sekarang misalkan
bx + a = 0 (mod P)
. Kemudiana = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Karena
P
prima, bilangan bulatmod P
adalah domain integral . Jadib = 0 (mod P)
, atau1 - 10x = 0 (mod P)
.Kita tahu
0 <= b < 10 < P
, jadi kalaub = 0 (mod P)
begitub = 0
. Tapi kami mengatakanb
yang baik1
,3
,7
, atau9
, jadi ini adalah mustahil. Karena itu1 - 10x = 0 (mod P)
, begitu10x = 1 (mod P)
. Dengan kata lain,x
adalah kebalikan dari10
, moduloP
.Sekarang anggaplah
N
adalah bilangan bulat non-negatif yang digit terakhirnyad
, jadiN = 10c + d.
Kami memiliki rantai pernyataan yang setara:10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Kegunaan?
Saya juga bertanya-tanya apakah tes keterbagian (diberikan
N = 10c + d
, gantiN
dengandx + c
) akan benar-benar produktif dalam praktik. Atau setidaknya, apakah itu dapat diandalkan menggantikanN
dengan angka yang lebih kecil dariN
(dalam nilai absolut)?Misalkan
N = 10c + d
, di manac >= 0
dan0 <= d < 10
. Oleh karena itu10c = N - d <= N
. Dengan ketimpangan segitiga,|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Jadi kalau
5P <= 9N/10
begitu|c + dx| < N
.Khususnya, jika
N >= 6P
, maka|c + dx| < N
. Dengan demikian, mengingatP
kita mulai dengan menghitung2P
,3P
, ...,6P
, bersama denganx
. Kemudian diberikanN
, kami menjalankan uji dibagi berulang kali sampai kita mencapai angka kurang dari atau sama dengan6P
, dan memeriksa apakah hasilnya adalah salah satu nomor0
,P
,2P
, ...,6P
.(Tentu saja, setiap kali kita mencapai angka negatif, kita menggantinya dengan nilai absolutnya, yang baik-baik saja karena
q
dapat dibagi denganP
jika dan hanya jika(-q)
ada.)Peningkatan Terikat
Saya perhatikan bahwa
|x|/P
sepertinya tidak pernah dekat1/2
. Bahkan sepertinya itu selalu kurang dari1/3
... atau setelah diperiksa lebih dekat, selalu sangat dekat dengan salah satu1/10
atau3/10
. Yang terbesar yang pernah ada tampaknya4/13
(yang terjadi ketikaP=13
danx=4
). Mengapa ini terjadi?Membiarkan
u
menjadi bilangan bulat dan anggap itu10u = kP + 1
untuk bilangan bulatk
, jadiu
adalah kebalikan dari10
, moduloP
. Kemudian kita juga tahu bahwak
itu relatif prima10
, karenak(-P)
setara dengan1
modulo10
.Sekarang, kita tahu bahwa invers dari
10
moduloP
semuanya berbeda berdasarkan kelipatanP
, sehingga kita dapat mengambil bilangan bulatu
dan menambah atau mengurangi kelipatanP
sesuka hati, dan hasilnya akan selalu menjadi kebalikan dari10
moduloP
. Misalkan kita memilih untuk mengurangiP
dariu
: kita mendapatkan10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Dengan kata lain, penurunan (masing-masing, meningkatkan)
u
olehP
bersesuaian dengan penurunan (peningkatan)k
oleh10
. Kami ingin menambah / mengurangi kelipatan dariP
dariu
sampai sisi kiri diminimalkan dalam nilai absolut; tetapi sisi kiri diminimalkan tepat ketika sisi kanan diminimalkan, dan oleh karena itu kami ingin menambahkan / mengurangi10
darik
sampai sisi kanan diminimalkan dalam nilai absolut.Tapi kita tahu bahwa ini akan terjadi ketika
k
adalah antara-5
dan5
, dan karena itu (karenak
relatif prima untuk10
) berarti inik
adalah baik-3
,-1
,1
, atau3
. (Ini adalah isi dari komentar @ Neil di bawah OP. Terima kasih, Neil! )Jadi ketika
|u|
diminimalkan (yaitu,u=x
), kita akan memilikix/P = u/P = k/10 + 1/(10P)
, di manak
adalah baik-3
,-1
,1
, atau3
. Oleh karena itu|x|/P <= 3/10 + 1/(10P)
. Setara|x| <= (3P + 1)/10
,.Lebih jauh, ketidaksetaraan ini sangat ketat pada
P=11
, karena pada saatP=11
kita milikix=-1
dank=-1
. Yang terkecilP
yang dimiliki kesetaraan adalahP=13
(di manax=4
dank=3
).Oleh karena itu yang terbesar yang
|x|/P
pernah didapat adalah3/10 + 1/(10*13)
, karenaP=13
merupakan perdana pertama yang kita milikik=3
, dan di antara mereka yang memilikik=3
,1/(10P)
istilah itu terbesar ketikaP
terkecil (yaitu, padaP=13
). Karena itu, untuk semuaP
, kami juga punya|x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. Ini menjelaskan mengapa dalam kode di atas kita dapat menginisialisasii = P/3
daripada harus mulaiP/2
.Selanjutnya, batas-batas di bagian Kegunaan di atas sekarang dapat ditingkatkan.
Lemma : Biarkan di
N = 10c + d
manac > 0
dan0 <= d <= 9
. Laluc + d|x| < N/10 + 9(3P + 1)/10
. (Perhatikan ketimpangan yang ketat.)Bukti Lemma: berdasarkan kasus. Kasus I:,
d = 0
jadiN = 10c
. Laluc + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.Kasus II:
0 < d <= 9
. Lalu10c = N - d < N
, begituc < N/10
. Oleh karena ituc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. QED.Jadi, jika
N > 3P
(danN = 10c + d
seperti sebelumnya), maka3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
Jadi, kalau
N > 3P
begituc + d|x| < N
.Karena itu, kita hanya perlu menemukan
P
,2P
dan3P
, bersama denganx
. MengingatN > 0
, sementaraN > 3P
, kami gantiN
dengan|c + dx|
, yang berkurangN
. Akhirnya kita akan mendapatkannyaN <= 3P
; pada saat itu kami berhenti dan memeriksa apakahN
sama dengan salah satu nomor0
,P
,2P
, atau3P
.Kita tidak bisa berbuat lebih baik daripada
3P
secara umum. Misalnya, anggaplahP = 13
danN = 39
begitux = 4
. Kemudian gantiN
dengandx + c = 9(4) + 3
daunN
tidak berubah.sumber
-1
luar tanda kurung: 43 byteRuang putih , 92 byte
Perhatikan bahwa sintaksis bahasa ini hanya terdiri dari spasi putih , sehingga setiap karakter spasi putih telah diawali di sini dengan S, T, atau L (masing-masing sesuai dengan Space, Tab, dan Linefeed). Ini dapat dihapus tanpa kehilangan fungsionalitas, tetapi mereka termasuk di sini untuk menampilkannya dengan benar.
Cobalah online!
sumber
Japt , 14 byte
Terinspirasi oleh solusi Neil .
Uji secara online!
Penjelasan:
sumber
Pyke , 10 byte
Coba di sini!
sumber
Excel, 27 byte
Dapat dimasukkan ke dalam Cell sebagai
selama 25 byte, tetapi pembaruan otomatis Excel.
sumber