Bài 3. Số thân thiết (5 điểm) Giữa bạn bè với nhau có tình hữu nghị và bạn có biết rằng giữa các con số với nhau cũng có "sự thân thiết". Một nhà toán học từng nói: "Ai là bạn tốt của tôi thì chúng tôi sẽ giống như hai con số 220 và 284". Vậy tại sao 220 và 284 lại tượng trưng cho những người bạn thân thiết? Thì ra, 220 ngoài bản thân nó ra còn có 11 ước số khác là 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 và 110. Tổng của 11 ước số này vừa đúng bằng 284. Cũng vậy, 284 ngoài bản thân nó còn có 5 ước số khác là: 1, 2, 4, 71, 142, tổng của chúng cũng vừa đúng bằng 220. Hai số này, trong anh có tôi, trong tôi có anh, gắn bó thân thiết, không tách rời nhau. Các nhà toán học cổ Hy Lạp gọi những cặp số có tính chất như vậy là "số thân thiết". Yêu cầu: Hãy tìm cặp “số thân thiết” trong đoạn M, N. Nếu không có cặp số nào thì ghi -1. Dữ liệu vào: File văn bản FRIEND.INP gồm hai số nguyên dương M, N (M <N) các số cách nhau bởi dấu cách. Dữ liệu ra: Ghi ra file văn bản FRIEND.OUT - Có thể có nhiều dòng, mỗi dòng là một cặp “số thân thiết” mỗi số trong cặp cách nhau ít nhất một dấu cách. - Trường hợp không tìm ra cặp nào trong đoạn M, N thì ghi -1. Ví dụ: FRIEND.INP 1 1500 FRIEND.OUT 220 284 1184 1210 Ràng buộc: • Có 50% số test ứng với 50% số điểm có M, N ≤ 2x103; • Có 50% số test còn lại ứng với 50% số điểm có M, N ≤ 15x103.
1 câu trả lời
var a,b:array[0..10000007] of int64;
function uoc(n:longint):int64;
var t,i:longint;
begin
t:=1;
for i := 2 to trunc(sqrt(n)) do
if n mod i = 0 then
if i <> n div i then t := t + i + n div i
else t:=t+i;
exit(t);
end;
var l,r,i,j,cnt:longint;
begin
assign(input,'friend.inp');reset(input);
assign(output,'friend.out');rewrite(output);
readln(l,r);
cnt := 0;
for i := l to r do
begin
j := uoc(i);
if (uoc(j)=i) and (j>=i) and (j<=r) and (i <> j) then
begin
inc(cnt);
a[cnt] := i;
b[cnt] := j;
end;
end;
if cnt=0 then
begin
writeln(-1);
exit;
end;
for i := 1 to cnt do
write(a[i],#32,b[i],#13#10);
close(input);close(output);
end.