:tt!/XR6#uG))
在线尝试!或验证所有测试用例。
输入大小可能会受到浮点精度的限制。所有测试用例都给出正确的结果。
说明
这产生的所有级分k/m
用k
,m
在[1 2 ...n]
作为n
× n
矩阵。行表示分子,列表示分母。实际上,矩阵项包含的是反分数m/k
,而不是k/m
,但这无关紧要,在其余的解释中可以忽略。
矩阵条目被隐式视为按列优先顺序排序。在这种情况下,这对应于所需的顺序:分母,然后是分子。
此矩阵中需要忽略三种类型的条目:
- 项
k/m
,k>m
即具有相同的值作为先前的条目(例如,2/4
被忽略,因为它是一样的1/2
)
- 条目
k/k
,k>1
。分子超过分母的条目
- 条目
k/m
,k<m
(这些不是问题的一部分)。
忽略条目是通过一个unique
函数完成的,该函数会稳定地删除重复的值并输出尚存条目的索引。这样,上面类型1的条目将被自动删除。为了处理类型2和3,将对角线和下方的矩阵条目设置为0
。这样,除第一个(对应于有效分数1/1
)外,所有零条目都将被删除。
以输入4
为例。
: % 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