(44 çarpı hala 44.) Bir bayt tasarrufu için Fireflame241 sayesinde!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Çevrimiçi deneyin!
Arasında tam tersi bir sayı vardır 0ve P-1bunun tersi de geçerlidir 10. Ancak bu ters udeğer daha büyük olursa P/2, o zaman (u-P)terstir ve mutlak değeri daha küçüktür u. Böylece, ve ile xarasındaki benzersiz sayıyı gerçekten arıyoruz.-P/2P/2 bunun tersi10 .
Yukarıdaki kod tam olarak bunu yapar (zeminden) P/2ve bir tersine ulaşana kadar aşağı doğru adım atar. Bu daha bazı değerinden büyük gerçekleşmesi gerekir -P/2sürece Pdaha asal büyüktür 10. Daha kesin olarak, eğer sadece Pvezne olması durumunda sona erecektir 10.
Düzenleme: Aslında ve xarasında olması garanti olduğu ortaya çıkıyor , bu nedenle mevcut sürüm başlar ve oradan aşağı iner. Etiketli bölüme bakın-P/3P/3P/3 açıklaması için Geliştirilmiş Ciltli .
Matematiksel açıklama
Bölünebilirlik testinin neden işe yaradığı hemen belli değildi. Başka birinin merak etmesi durumunda bir açıklama.
Izin Pvermek bir asal, daha büyük 10, son rakam olan b. Böylece
P = 10a + b
nerede a > 0, ve 0 <= b < 10. Aslında bya 1, 3, 7, veya 9, bir asal büyüktür çünkü10 bu rakamlardan birine mutlaka sonuna.
Şimdi varsayalım bx + a = 0 (mod P). Sonra
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Beri Pasal tamsayıları mod Pbir olan tamlık . Bu yüzden yab = 0 (mod P) , ya 1 - 10x = 0 (mod P).
Biliyoruz 0 <= b < 10 < P, eğer b = 0 (mod P)öyleyse b = 0. Ama dedik bya edilir 1, 3, 7veya 9, bu nedenle bu imkansızdır. Bu 1 - 10x = 0 (mod P)nedenle 10x = 1 (mod P). Başka bir deyişle , modulo'nun xtersidir10P .
Şimdi N, son basamağı olan negatif olmayan bir tam sayı olduğunu varsayalım d, bu yüzden N = 10c + d. eşdeğer ifadeler zincirimiz var:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Kullanışlılığı?
Ben de (verilen bölünebilme testi olmadığını merak N = 10c + d, yerine Ngöre dx + c) aslında pratikte üretken olacaktır. Ya da en azından güvenilir Nbir değerden N(mutlak değerde) küçük bir sayı ile mi geçer?
Varsayalım N = 10c + d, nerede c >= 0ve 0 <= d < 10. Bu nedenle 10c = N - d <= N. Üçgen eşitsizliği ile,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Böylece 5P <= 9N/10, o zaman |c + dx| < N.
Özellikle, eğer N >= 6P, o zaman |c + dx| < N. Böylece, verilen Pbiz hesaplayarak başlar 2P, 3P, ..., 6P, ile birlikte x. Sonra verilen Naz süremiz bir numara veya ulaşılması eşit olana kadar tekrar tekrar bölünebilme testi, 6Pve sonuç numaralardan herhangi olup olmadığını kontrol 0, P, 2P, ..., 6P.
(Tabii ki, negatif bir sayıya ulaştığımızda, onu mutlak değeri ile değiştiririz, bu iyidir, çünkü eğer sadece ve sadece ise qbölünebilir .)P(-q)
Geliştirilmiş Sınır
Bunun |x|/Phiç yakın olmadýđýný fark ettim 1/2. O hep az oldu gibi Aslında görünüyordu 1/3... ya yakından incelendiğinde üzerine çok yakın ya hep, 1/10ya 3/10. Şimdiye kadar olan en büyük görünüyordu 4/13( P=13ve ne zaman olur x=4). Neden böyle olsun ki?
Izin uvermek bir tamsayı ve varsayalım 10u = kP + 1bazı tamsayı k, utersi 10, modulo P. Sonra da biliyoruz knispeten asal 10beri k(-P)eşdeğerdir 1modulo 10.
Şimdi, tersidir biliyoruz 10modulo Ptüm katları farklılık Pbiz tamsayı alabilir, böylece uekleyebilir veya katları çıkarma ya Piradesiyle ve sonuç her zaman hala bir ters olacak 10modülo P. Çıkartmayı tercih varsayalım Pdan u: aldığımız
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Diğer bir deyişle, azalan (sırasıyla artarak) uile P(artan) azalan tekabül kile 10. Biz Eklemek istediğiniz / bir çıkarma katları Parasından usol taraftaki mutlak değer olarak en aza kadar; ancak sol taraf tam olarak sağ taraf küçültüldüğünde en aza indirilir ve bu nedenle sağ taraf mutlak değerde en aza 10indirilene kkadar toplama / çıkarma yapmak istiyoruz .
Ama biz bu ne zaman olacağını biliyorum karasındadır -5ve 5ve bu nedenle (çünkü knispeten asal 10) Bu araçlar kya -3, -1, 1, veya 3. (Bu @ Neil'in OP altındaki yorumunun içeriğidir. Teşekkürler Neil! )
Böylece |u|en aza indirilir (yani, u=x), biz olacak x/P = u/P = k/10 + 1/(10P)burada, kya -3, -1, 1ya da 3. Bu nedenle |x|/P <= 3/10 + 1/(10P). Eşdeğer olarak |x| <= (3P + 1)/10.
Dahası, bu eşitsizlik katıdır P=11, çünkü P=11bizde x=-1ve vardır k=-1. PEşitliğin sahip olduğu en küçük şey P=13(nerede x=4ve k=3).
Bu nedenle, |x|/Pşimdiye kadar elde edilen en büyük şey 3/10 + 1/(10*13), çünkü P=13sahip olduğumuz ilk asaldır k=3ve sahip olanlar arasında k=3, 1/(10P)terim Pen küçük olduğunda (yani, at P=13) en büyüktür . Bu nedenle, herkes için Pde var |x|/P <= 3/10 + 1/130 = 4/13 < 1/3. Bu, yukarıdaki kodda i = P/3,P/2 .
Ayrıca, yukarıdaki Yararlılık bölümündeki sınırlar artık geliştirilebilir.
Lemma : N = 10c + dNerede c > 0ve olsun 0 <= d <= 9. Sonrac + d|x| < N/10 + 9(3P + 1)/10 . (Katı eşitsizliğe dikkat edin.)
Lemma kanıtı: vakalara göre. Durum I: d = 0yani N = 10c. Sonrac + d|x| = c = N/10 < N/10 + 9(3P + 1)/10 .
Durum II: 0 < d <= 9. Sonra 10c = N - d < N, bu yüzden c < N/10. bu nedenlec + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10 . QED.
Böylece, eğer N > 3P(ve N = 10c + dönceki gibi), o zaman
3P + 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
Eğer N > 3Pöyleyse c + d|x| < N.
Bu nedenle, sadece bulmak zorunda P, 2Pve 3Pbirlikte x. Verilen N > 0süre N > 3P, biz yerine Ngöre |c + dx|azalır, hangi N. Sonunda alacağız N <= 3P; o noktada durup olmadığını kontrol Nnumaralardan herhangi eşittir 0, P, 2P, veya 3P.
Genelden daha iyisini yapamayız 3P. Örneğin varsayalım P = 13ve N = 39bu yüzden, x = 4. Sonra değiştirilmesi Nyoluyla dx + c = 9(4) + 3yaprakları Ndeğişmeden.
xmutlak değerdeki en küçük değeri arıyoruz10*x-1.