Задача

Биллиард представляет собой прямоугольник размерами $M \times N$, где $M$ и $N$ — натуральные числа. Из верхней левой лузы вылетает шар под углом $45^{\circ}$ к соседним сторонам. Лузы размещено только в углах биллиарда. Определите количество столкновений шара с бортами биллиарда, после которых он опять попадет в одну из луз, и номер лузы, в которую упадет шар. Считать, что трение отсутствует, столкновения абсолютно упругие, а шар — материальная точка.
Входные данные
Во входной строке два числа $M$ и $N$, $1 ≤ M, N ≤ 2000000000$. Нумерация луз по часовой стрелке, начиная с левой верхней лузы, из которой вылетел шар, согласно рисунка. $M$ — горизонтальная сторона биллиарда, $N$ — вертикальная сторона биллиарда.
Выходные данные
Два числа: количество отражений шара и номер лузы в которую упадет шар.
Тесты
| Входные данные | Выходные данные | 
| 2 1 | 1 2 | 
| 5 6 | 9 4 | 
| 12 33 | 13 2 | 
| 156 156 | 0 3 | 
| 654 236 | 443 4 | 
Код программы
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.io.*; import java.util.*; import java.math.*; public class Main {    public static void main(String[] args) {       Scanner in = new Scanner(System.in);       PrintWriter out = new PrintWriter(System.out);       long m = in.nextLong();       long n = in.nextLong();       BigInteger bi1, bi2, bi3;       bi1 = BigInteger.valueOf(m);       bi2 = BigInteger.valueOf(n);       bi3 = bi1.gcd(bi2);       long g = bi3.longValue();       m /= g;       n /= g;       out.print((n + m - 2) + " ");       if(n % 2 == 0 & m % 2 != 0) out.print(4);       if(n % 2 != 0 & m % 2 != 0) out.print(3);       if(n % 2 != 0 & m % 2 == 0) out.print(2);       out.flush();    } } | 
Решение
Чтобы решить эту задачу, необходимо сперва найти НОД значений $M$ и $N$ из условия. Для этого, нужно подключить библиотеку, содержащую функцию для нахождения НОД двух чисел, что мы и сделали в $3$ строке. Далее, в $17$ строке, введем перемененную g и присвоим ей значение НОД для $M$ и $N$. Теперь же, зная наш НОД, с его помощью можем подобрать эквивалентные числам из входного потока значения, которые будут, возможно, гораздо меньшими, чем изначальные, и работать уже с ними. В последующих строках находим искомые данные, причем количество отражений шара всегда находится по одной и той же формуле, в то время как номер лузы, в которую упадет шар, зависит от выполнения одного из трех условий, что и видно в коде.
Ссылки
Условие задачи на e-olymp
Код решения на Ideone
Решение этой же задачи на C++
