Номер элемента в матрице

имеется некоторая матрица, в которой находятся натуральные числа. Зная число, необходимо найти его координаты в матрице. Элементы размещены таким образом: введите сюда описание изображения

На данный момент я нашёл последовательность, которой соответствует номера по крайней верхней горизонтали (1, 3, 4, 10...):

a(n) = if n mod 2 == 0 then n*(n+1)/2, otherwise (n-1)*n/2 + 1.

И крайней левой вертикали (1, 2, 6, 7...):

a(n) = n*(n+1)/2 if n is odd, otherwise (n-1)*n/2 + 1.

Однако пока что не могу додуматься, как это применить.

К примеру, единица в данной матрице имеет координаты [0, 0], а 19 [2, 3] и так далее.


Ответы (2 шт):

Автор решения: TigerTV.ru

Пользуясь этим, этим и этим можно написать следующее:

from math import sqrt

def get_xy(i):
    d = int(sqrt(1 + (i - 1) * 8) + 1) // 2 - 1
    r = i - d * (d + 1) // 2 - 1
    return (r, d - r) if d & 1 else (d - r, r)

i = 44444444447777777777777
p = get_xy(i)
print(i, p)

Вывод:

44444444447777777777777 (103664287789, 194478109221)
→ Ссылка
Автор решения: Oleh Chaika

Кажется, у меня есть решение, вот код на питоне:

num = int(input())
sum = 1
i = 1
while (num>sum):
    i += 1
    sum += i
diff = sum - num
if (i%2):
    Y = i - diff
    X = diff + 1
else:
    Y = diff + 1
    X = i - diff

Таковым образом мы вычисляем номер диагонали, на которой лежит число (а это полезно, ведь на диагоналях соседние числа отличаются на единицу). Это возможно благодаря тому, что на каждой диагонали лежит на 1 число больше, чем на предыдущей.

Далее, мы смотрим на чётность номера диагонали. По совместительству это количество чисел на диагонали, и простейшим образом вычисляем позицию числа в матрице. Можно поэкспериментировать.

→ Ссылка