Нужно чуть точнее условие, но обычно под такой задачей подразумевают две арифметические прогрессии на числовой прямой: кенгуру 1 стартует в A и прыгает шагом p, кенгуру 2 стартует в B и прыгает шагом q (позиции после n прыжков: A + n p и B + m q, n,m ≥ 0). В этом смысле точки, в которых побывают оба — это пересечение множеств S1 = {A + n p | n ≥ 0} и S2 = {B + m q | m ≥ 0}.
Краткий критерий и способ найти все такие точки:
Пусть g = gcd(p,q). Необходимо и достаточно, чтобы B − A делилось на g; иначе пересечение пусто (никакой общей точки не будет).
Если (B − A) кратно g, то найдутся целые n,m такие, что A + n p = B + m q. Найдём одно решение:
Решаем сравнение n·p ≡ (B − A) (mod q). Это делается через расширенный алгоритм Евклида: найти обратный к (p/g) по модулю (q/g) и получить минимальное n0 ≥ 0.Тогда первая общая точка X0 = A + n0·p (минимальная по n удовлетворяющая равенству).
Все общие точки образуют арифметическую прогрессию с шагом l = lcm(p,q) = p·q/g: Xk = X0 + k·l, k ∈ Z (при условии, что n и m остаются ≥ 0; если требуем n,m ≥ 0, то k ограничен так, чтобы соответствующие индексы были неотрицательны).
Особые случаи:
Если p = 0 или q = 0 — один из кенгуру не двигается. Тогда пересечение либо пусто, либо равняется единственной точке (если неподвижный находится в одной из точек прогрессии другого).Если рассматривается вся числовая прямая (n и m могут быть любые целые), то все общие точки — X0 + k·l для всех целых k.
Пример: A = 3, p = 4; B = 7, q = 6. g = gcd(4,6) = 2, B − A = 4 — делится на 2, значит пересечение есть. Решаем 4n ≡ 4 (mod 6) → (2n ≡ 2 (mod 3)) → n ≡ 1 (mod 3). Минимальное n0 = 1. X0 = 3 + 1·4 = 7. Шаг l = lcm(4,6) = 12. Общие точки: 7, 19, 31, ...
Если хотите, подставьте конкретные A, p, B, q — я быстро посчитаю все общие точки или первый общий пункт и шаг.
Нужно чуть точнее условие, но обычно под такой задачей подразумевают две арифметические прогрессии на числовой прямой: кенгуру 1 стартует в A и прыгает шагом p, кенгуру 2 стартует в B и прыгает шагом q (позиции после n прыжков: A + n p и B + m q, n,m ≥ 0). В этом смысле точки, в которых побывают оба — это пересечение множеств
S1 = {A + n p | n ≥ 0} и S2 = {B + m q | m ≥ 0}.
Краткий критерий и способ найти все такие точки:
Пусть g = gcd(p,q). Необходимо и достаточно, чтобы B − A делилось на g; иначе пересечение пусто (никакой общей точки не будет).
Если (B − A) кратно g, то найдутся целые n,m такие, что A + n p = B + m q. Найдём одно решение:
Решаем сравнение n·p ≡ (B − A) (mod q). Это делается через расширенный алгоритм Евклида: найти обратный к (p/g) по модулю (q/g) и получить минимальное n0 ≥ 0.Тогда первая общая точка X0 = A + n0·p (минимальная по n удовлетворяющая равенству).Все общие точки образуют арифметическую прогрессию с шагом l = lcm(p,q) = p·q/g:
Xk = X0 + k·l, k ∈ Z (при условии, что n и m остаются ≥ 0; если требуем n,m ≥ 0, то k ограничен так, чтобы соответствующие индексы были неотрицательны).
Особые случаи:
Если p = 0 или q = 0 — один из кенгуру не двигается. Тогда пересечение либо пусто, либо равняется единственной точке (если неподвижный находится в одной из точек прогрессии другого).Если рассматривается вся числовая прямая (n и m могут быть любые целые), то все общие точки — X0 + k·l для всех целых k.Пример:
A = 3, p = 4; B = 7, q = 6.
g = gcd(4,6) = 2, B − A = 4 — делится на 2, значит пересечение есть.
Решаем 4n ≡ 4 (mod 6) → (2n ≡ 2 (mod 3)) → n ≡ 1 (mod 3). Минимальное n0 = 1.
X0 = 3 + 1·4 = 7. Шаг l = lcm(4,6) = 12. Общие точки: 7, 19, 31, ...
Если хотите, подставьте конкретные A, p, B, q — я быстро посчитаю все общие точки или первый общий пункт и шаг.