(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 0
ve P-1
bunun tersi de geçerlidir 10
. Ancak bu ters u
değ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 x
arasındaki benzersiz sayıyı gerçekten arıyoruz.-P/2
P/2
bunun tersi10
.
Yukarıdaki kod tam olarak bunu yapar (zeminden) P/2
ve 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/2
sürece P
daha asal büyüktür 10
. Daha kesin olarak, eğer sadece P
vezne olması durumunda sona erecektir 10
.
Düzenleme: Aslında ve x
arası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/3
P/3
P/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 P
vermek 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 b
ya 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 P
asal tamsayıları mod P
bir 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 b
ya edilir 1
, 3
, 7
veya 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 x
tersidir10
P
.
Ş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 N
göre dx + c
) aslında pratikte üretken olacaktır. Ya da en azından güvenilir N
bir değerden N
(mutlak değerde) küçük bir sayı ile mi geçer?
Varsayalım N = 10c + d
, nerede c >= 0
ve 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 P
biz hesaplayarak başlar 2P
, 3P
, ..., 6P
, ile birlikte x
. Sonra verilen N
az süremiz bir numara veya ulaşılması eşit olana kadar tekrar tekrar bölünebilme testi, 6P
ve 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 q
bölünebilir .)P
(-q)
Geliştirilmiş Sınır
Bunun |x|/P
hiç 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/10
ya 3/10
. Şimdiye kadar olan en büyük görünüyordu 4/13
( P=13
ve ne zaman olur x=4
). Neden böyle olsun ki?
Izin u
vermek bir tamsayı ve varsayalım 10u = kP + 1
bazı tamsayı k
, u
tersi 10
, modulo P
. Sonra da biliyoruz k
nispeten asal 10
beri k(-P)
eşdeğerdir 1
modulo 10
.
Şimdi, tersidir biliyoruz 10
modulo P
tüm katları farklılık P
biz tamsayı alabilir, böylece u
ekleyebilir veya katları çıkarma ya P
iradesiyle ve sonuç her zaman hala bir ters olacak 10
modülo P
. Çıkartmayı tercih varsayalım P
dan 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) u
ile P
(artan) azalan tekabül k
ile 10
. Biz Eklemek istediğiniz / bir çıkarma katları P
arasından u
sol 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 10
indirilene k
kadar toplama / çıkarma yapmak istiyoruz .
Ama biz bu ne zaman olacağını biliyorum k
arasındadır -5
ve 5
ve bu nedenle (çünkü k
nispeten asal 10
) Bu araçlar k
ya -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, k
ya -3
, -1
, 1
ya 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=11
bizde x=-1
ve vardır k=-1
. P
Eşitliğin sahip olduğu en küçük şey P=13
(nerede x=4
ve k=3
).
Bu nedenle, |x|/P
şimdiye kadar elde edilen en büyük şey 3/10 + 1/(10*13)
, çünkü P=13
sahip olduğumuz ilk asaldır k=3
ve sahip olanlar arasında k=3
, 1/(10P)
terim P
en küçük olduğunda (yani, at P=13
) en büyüktür . Bu nedenle, herkes için P
de 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 + d
Nerede c > 0
ve 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 = 0
yani 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
, 2P
ve 3P
birlikte x
. Verilen N > 0
süre N > 3P
, biz yerine N
göre |c + dx|
azalır, hangi N
. Sonunda alacağız N <= 3P
; o noktada durup olmadığını kontrol N
numaralardan herhangi eşittir 0
, P
, 2P
, veya 3P
.
Genelden daha iyisini yapamayız 3P
. Örneğin varsayalım P = 13
ve N = 39
bu yüzden, x = 4
. Sonra değiştirilmesi N
yoluyla dx + c = 9(4) + 3
yaprakları N
değişmeden.
x
mutlak değerdeki en küçük değeri arıyoruz10*x-1
.