MATL , 17 13 byte
:tt!/XR6#uG))
Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .
Kích thước đầu vào có thể bị giới hạn bởi độ chính xác điểm nổi. Tất cả các trường hợp thử nghiệm cho kết quả chính xác.
Giải trình
Điều này tạo ra tất cả các phân số k/m
với k
, m
trong [1 2 ...n]
, như một ma trận n
× n
. Hàng biểu thị tử số và cột biểu thị mẫu số. Trên thực tế, mục nhập ma trận chứa phần nghịch đảo m/k
, thay vì k/m
, nhưng điều này không liên quan và có thể bị bỏ qua trong phần còn lại của lời giải thích.
Các mục ma trận được coi là hoàn toàn được sắp xếp theo thứ tự chính của cột. Trong trường hợp này, điều này tương ứng với thứ tự yêu cầu: mẫu số, sau đó là tử số.
Ba loại mục cần phải được bỏ qua khỏi ma trận này:
- Các mục nhập
k/m
, k>m
có cùng giá trị với mục nhập trước đó (ví dụ: 2/4
bị bỏ qua vì nó giống như 1/2
)
- Bài dự thi
k/k
, k>1
. Các mục nhập có tử số vượt quá mẫu số
- Bài dự thi
k/m
, k<m
(đây không phải là một phần của vấn đề).
Bỏ qua các mục được thực hiện với một unique
chức năng, giúp loại bỏ ổn định các giá trị trùng lặp và xuất ra các chỉ số của các mục còn tồn tại. Với điều này, các mục thuộc loại 1 ở trên sẽ tự động bị xóa. Để đối phó với loại 2 và 3, các mục ma trận ở đường chéo và bên dưới được đặt thành 0
. Bằng cách này, tất cả các mục nhập bằng 0 sẽ bị xóa trừ phần đầu tiên (tương ứng với phần hợp lệ 1/1
).
Hãy xem xét đầu vào 4
là một ví dụ.
: % Input n implicitly. Push range [1 2 ...n]
% STACK: [1 2 3 4]
t % Duplicate
% STACK: [1 2 3 4], [1 2 3 4]
t! % Duplicate and transpose
% STACK: [1 2 3 4], [1 2 3 4], [1; 2; 3; 4]
/ % Divide element-wise with broadcast: gives matrix with all pairs
% STACK: [1 2 3 4], [1 2 3 4;
0.5000 1 1.5000 2;
0.3333 0.6667 1 1.3333;
0.2500 0.5000 0.7500 1 ]
XR % Upper triangular part above the diagonal. This sets to 0 all entries
% corresponding to fractions that equal or exceed 1. (Since the matrix
% actually contains the inverse fractions, nonzero entries will contain
% values greater than 1)
% STACK: [1 2 3 4], [0 2 3 4;
0 0 1.5000 2;
0 0 0 1.3333;
0 0 0 0 ]
6#u % Indices of first appearance of unique elements
% STACK: [1 2 3 4], [1; 5; 9; 10; 13; 15]
G % Push input n again
% STACK: [1 2 3 4], [1; 5; 9; 10; 13; 15], 4
) % Index: get the n-th entry from the array of indices of unique elements
% STACK: [1 2 3 4], 10
) % Index (modular): get the corresponding real part. Display implicitly
% STACK: 2