(Bỏ qua 44 vẫn là 44.) Cảm ơn Fireflame241 vì đã tiết kiệm một byte!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Hãy thử trực tuyến!
Có chính xác một số giữa 0
và P-1
đó là một số nghịch đảo 10
. Nhưng nếu nghịch đảo đó u
xảy ra lớn hơn P/2
, thì đó (u-P)
cũng là nghịch đảo và có giá trị tuyệt đối nhỏ hơn u
. Vì vậy, hóa ra chúng ta thực sự đang tìm kiếm số duy nhất x
giữa -P/2
và P/2
đó là số nghịch đảo 10
.
Đoạn mã trên thực hiện chính xác điều đó, bắt đầu từ (tầng của) P/2
và bước xuống dưới cho đến khi đạt được nghịch đảo. Điều này phải xảy ra đối với một số số lớn hơn -P/2
miễn P
là số nguyên tố lớn hơn 10
. Chính xác hơn, nó sẽ chấm dứt nếu và chỉ khi P
là đồng thời 10
.
Chỉnh sửa: Thực tế hóa ra x
là được đảm bảo ở giữa -P/3
và P/3
, vì vậy phiên bản hiện tại bắt đầu từ P/3
và bước xuống từ đó. Xem phần có nhãn Giới hạn được cải thiện để biết giải thích về điều này.
Giải thích toán học
Nó không rõ ràng ngay lập tức với tôi tại sao thử nghiệm phân chia hoạt động. Đây là một lời giải thích, trong trường hợp bất cứ ai khác đang tự hỏi.
Hãy P
là một số nguyên tố, lớn hơn 10
, có chữ số cuối cùng b
. Như vậy
P = 10a + b
ở đâu a > 0
, và 0 <= b < 10
. Trong thực tế b
là một trong hai 1
, 3
, 7
, hoặc 9
, bởi vì một lớn hơn thủ hơn 10
phải kết thúc bằng một trong các chữ số.
Bây giờ giả sử bx + a = 0 (mod P)
. Sau đó
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Vì P
là số nguyên tố, các số nguyên mod P
là một miền tích phân . Vì vậy, hoặc b = 0 (mod P)
, hoặc 1 - 10x = 0 (mod P)
.
Chúng tôi biết 0 <= b < 10 < P
, vì vậy nếu b = 0 (mod P)
sau đó b = 0
. Nhưng chúng tôi đã nói b
được một trong hai 1
, 3
, 7
, hoặc 9
, vì vậy đây là không thể. Do đó 1 - 10x = 0 (mod P)
, vì vậy 10x = 1 (mod P)
. Nói cách khác, x
là nghịch đảo của 10
modulo P
.
Bây giờ giả sử N
là một số nguyên không âm có chữ số cuối cùng d
, vì vậy N = 10c + d.
chúng tôi có một chuỗi các câu lệnh tương đương:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Hữu ích?
Tôi cũng đã tự hỏi liệu thử nghiệm chia hết (được đưa ra N = 10c + d
, thay thế N
bằng dx + c
) có thực sự hiệu quả trong thực tế hay không. Hoặc ít nhất, nó có đáng tin cậy thay thế N
bằng một số nhỏ hơn N
(về giá trị tuyệt đối) không?
Giả sử N = 10c + d
, ở đâu c >= 0
và 0 <= d < 10
. Do đó 10c = N - d <= N
. Theo bất đẳng thức tam giác,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Như vậy 5P <= 9N/10
, nếu , sau đó |c + dx| < N
.
Đặc biệt, nếu N >= 6P
, sau đó |c + dx| < N
. Như vậy, cho P
chúng ta bắt đầu bằng cách tính toán 2P
, 3P
, ..., 6P
, cùng với x
. Sau đó, cho N
, chúng tôi chạy thử nghiệm chia hết liên tục cho đến khi chúng ta đạt được một số nhỏ hơn hoặc bằng đến 6P
, và kiểm tra xem kết quả là bất kỳ con số 0
, P
, 2P
, ..., 6P
.
(Tất nhiên, bất cứ khi nào chúng ta đạt đến một số âm, chúng ta sẽ thay thế nó bằng giá trị tuyệt đối của nó, điều này là tốt vì q
nó chia hết cho P
khi và chỉ khi (-q)
là.)
Giới hạn được cải thiện
Tôi nhận thấy rằng |x|/P
dường như không bao giờ gần gũi 1/2
. Trên thực tế, có vẻ như nó luôn nhỏ hơn 1/3
... hoặc khi kiểm tra kỹ hơn, nó luôn ở rất gần 1/10
hoặc3/10
. Lớn nhất nó từng có vẻ là 4/13
(xảy ra khi P=13
và x=4
). Tại sao điều này sẽ được?
Hãy u
là một số nguyên và giả sử rằng 10u = kP + 1
đối với một số nguyên k
, u
thì nghịch đảo của 10
modulo P
. Sau đó, chúng ta cũng biết rằng k
tương đối chính10
, vì k(-P)
tương đương với 1
modulo 10
.
Bây giờ, chúng ta biết rằng tất cả các nghịch đảo của 10
modulo P
đều khác nhau theo bội số P
, vì vậy chúng ta có thể lấy số nguyên u
và cộng hoặc trừ bội số của P
ý chí, và kết quả sẽ luôn là nghịch đảo của 10
modulo P
. Giả sử chúng ta chọn để trừ P
từ u
: chúng tôi nhận
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Nói cách khác, giảm (tương ứng, tăng) u
bởi P
tương ứng với giảm (tăng) k
bởi 10
. Chúng tôi muốn thêm / bớt bội số củaP
từ u
cho đến khi phía bên trái tay được giảm thiểu về giá trị tuyệt đối; nhưng phía bên trái tay được giảm thiểu một cách chính xác khi phía bên tay phải được giảm thiểu, và vì vậy chúng tôi muốn thêm / bớt 10
từ k
cho đến khi phía bên tay phải được giảm thiểu về giá trị tuyệt đối.
Nhưng chúng ta biết rằng điều này sẽ xảy ra khi k
là giữa -5
và 5
, và do đó (vì k
là tố cùng nhau với 10
) phương tiện này k
là một trong hai -3
, -1
,1
, hoặc 3
. (Đây là nội dung bình luận của @ Neil trong OP. Cảm ơn, Neil! )
Vì vậy khi |u|
được giảm thiểu (ví dụ u=x
), chúng tôi sẽ có x/P = u/P = k/10 + 1/(10P)
, nơi k
là một trong hai -3
, -1
, 1
, hoặc3
. Do đó |x|/P <= 3/10 + 1/(10P)
. Tương đương , |x| <= (3P + 1)/10
.
Hơn nữa, sự bất bình đẳng này là nghiêm ngặt tại P=11
, bởi vì tại P=11
chúng ta có x=-1
và k=-1
. Nhỏ nhấtP
mà bình đẳng giữ là P=13
(ở đâu x=4
và k=3
).
Do đó, số tiền lớn nhất |x|/P
từng có là 3/10 + 1/(10*13)
bởi vì đây P=13
là số nguyên tố đầu tiên mà chúng ta có k=3
và trong số đó có k=3
số hạng 1/(10P)
lớn nhất khi P
nhỏ nhất (ví dụ: tại P=13
). Do đó, đối với tất cả P
, chúng ta cũng có |x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. Điều này giải thích tại sao trong đoạn mã trên chúng ta có thể khởi tạo i = P/3
thay vì phải bắt đầu tại P/2
.
Hơn nữa, các giới hạn trong phần Hữu ích ở trên có thể được cải thiện.
Bổ đề : Hãy để N = 10c + d
nơi c > 0
và 0 <= d <= 9
. Sau đó c + d|x| < N/10 + 9(3P + 1)/10
. (Lưu ý sự bất bình đẳng nghiêm ngặt.)
Bằng chứng bổ đề: bằng các trường hợp. Trường hợp I : d = 0
, vì vậy N = 10c
. Sau đó c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.
Trường hợp II : 0 < d <= 9
. Sau đó10c = N - d < N
, vì vậy c < N/10
. Do đó c + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. QED.
Như vậy, nếu N > 3P
(và N = 10c + d
như trước), thì
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
Vì thế nếu N > 3P
sau đó c + d|x| < N
.
Do đó, chúng ta chỉ phải tìm P
, 2P
và 3P
, cùng với x
. Cho N > 0
, trong khi N > 3P
, chúng tôi thay thế N
bởi |c + dx|
, mà giảm N
. Cuối cùng, chúng tôi sẽ nhận được N <= 3P
; tại thời điểm đó, chúng tôi dừng lại và kiểm tra xem N
là tương đương với bất kỳ con số 0
, P
,2P
, hoặc 3P
.
Chúng ta không thể làm tốt hơn 3P
nói chung. Ví dụ, giả sử P = 13
và N = 39
, vì vậy x = 4
. Sau đó thay thế N
bằng dx + c = 9(4) + 3
lá N
không đổi.
x
giá trị nhỏ nhất tuyệt đối trong đó10*x-1
chia hết cho đầu vào.