Коллеги рассказали задачку

Jul 12, 2015 00:18

Есть бесконечная река с пристанями, пронумерованными всеми целыми числами (..., -2, -1, 0, 1, 2, ...). По реке плывет корабль-призрак, из неизвестной начальной точки, с фиксированной, но неизвестной целочисленной скоростью - т.е. для каких-то неизвестных a, b в день i корабль останавливается в пристани ai+b ( Read more... )

Leave a comment

Comments 17

djuffin July 12 2015, 07:56:33 UTC
Нужно спиралью от (0,0) пронумеровать все элементы множества Z x Z. И для каждого дня i брать элемент этого множества (a, b) с номером i, и ехать на пристань ai+b.

Reply

antilamer July 12 2015, 08:37:58 UTC
Ага. Можно обобщить - поймать корабль-призрак, движущийся по многомерному пространству по траектории, задаваемой неизвестной функцией из счетного семейства :)

Reply


sassa_nf July 12 2015, 08:08:26 UTC
или ещё другими словами - найти изоморфизм (Int,Int)->Int

Хотя возможно изоморфизм (Int,Int)->Nat, т.к. в задаче не сказано, как нумеруются дни.

Reply


plumqqz July 12 2015, 08:14:42 UTC
На бесконечной реке за конечное число шагов? Гм.

Reply

aamonster July 12 2015, 09:02:54 UTC
Ну, мы же можем досчитать до любого из бесконечного множества натуральных чисел за конечное число шагов.

Вот до всех - другое дело.

Reply


assaron July 12 2015, 08:17:50 UTC
Перебираем всю целочисленную плоскость в каком-нибудь порядке, например, по спирали от (0, 0), получаем последовательность (a_i, b_i). Наша функция f(i) = a_i + b_i * i. Соответственно, для любой заданной пары a, b будет конченое i, что f(i) = a + b * i, а именно, когда (a, b) = (a_i, b_i).

Reply


aamonster July 12 2015, 08:36:55 UTC
Тупой вариант: нумеруем все прогрессии (upd: все пары a,b) (это несложно, есть много методов) и останавливаемся каждую ночь в значении очередной прогрессии по списку.

Но чую, что должно быть красивое решение...

Reply

antilamer July 12 2015, 08:40:09 UTC
Это и так красивое :)

Reply

aamonster July 12 2015, 08:58:57 UTC
Красивое - в смысле, упирающееся не в мощность множеств, а, скажем, в делимость. Что-нибудь в виде явно записанной функции, а не через перебор последовательностей.

Reply

sassa_nf July 12 2015, 10:51:15 UTC
нутк, это ж через решение квадратного уравнения делается.

Все точки квадранта перечисляются как разложения числа на сумму двух чисел:

0 = (0+0)
1 = (1+0), (0+1)
2 = (2+0), (1+1), (0+2)
...

итак, перечисляются ряды треугольника. Номер ряда n можно вычислить из округления вверх решения квадратного уравнения n*(n+1)=2*i, номер точки в ряду из i и номера ряда тоже.

Тогда четыре квадранта перечисляются последовательно (номер точки в квадранте, квадрант) = (i / 4, i % 4).

Reply


Leave a comment

Up