Problem:
Score : 500 points

Problem Statement

Snuke is conducting an optical experiment using mirrors and his new invention, the rifle of Mysterious Light.

Three mirrors of length N are set so that they form an equilateral triangle.
Let the vertices of the triangle be a, b and c.

Inside the triangle, the rifle is placed at the point p on segment ab such that ap = X.
(The size of the rifle is negligible.)
Now, the rifle is about to fire a ray of Mysterious Light in the direction of bc.

The ray of Mysterious Light will travel in a straight line, and will be reflected by mirrors, in the same ways as "ordinary" light.
There is one major difference, though: it will be also reflected by its own trajectory as if it is a mirror!
When the ray comes back to the rifle, the ray will be absorbed.

The following image shows the ray's trajectory where N = 5 and X = 2.

It can be shown that the ray eventually comes back to the rifle and is absorbed, regardless of the values of N and X.
Find the total length of the ray's trajectory.

Constraints

2≦N≦10^{12}

1≦X≦N-1

N and X are integers.

Partial Points

300 points will be awarded for passing the test set satisfying N≦1000.

Another 200 points will be awarded for passing the test set without additional constraints.

Input

The input is given from Standard Input in the following format:

N X

Output

Print the total length of the ray's trajectory.

Sample Input 1

5 2

Sample Output 1

12

Refer to the image in the Problem Statement section.
The total length of the trajectory is 2+3+2+2+1+1+1 = 12.

Solution in Ruby (2.3.3) (judge verdict: Accepted)

# #include <stdio.h>
# #include <string.h>
# #include <stdlib.h>

# typedef unsigned long long ull;
# typedef   signed long long sll;


# int comp (const void *x, const void *y) {
# 	return *(int*)x - *(int*)y;
# }

# int min (int x, int y) {
# 	return (x < y) ? x : y;
# }

# int solve (ull x, ull y) {
# 	printf("%llu %llu\n", x, y);
# 	if (x > y) {
# 		return (x / y) * 2 + solve(x % y, y);
# 	} else if (x == 0) {
# 		return 0;
# 	} else {
# 		ull s = y / x;
# 		return s * (x + y) - (s * (s-1) / 2) * x + solve(y % x, x);
# 	}
# }

# int main (void) {
# 	ull n, x;
# 	scanf("%llu%llu", &n, &x);
# 	// if ((x << 1) == n) {
# 	// 	printf("%llu\n", 3 * x);
# 	// } else {
# 	// 	printf("%llu\n", 6 * x);
# 	// }
# 	printf("%llu\n", x + solve(x, n-x));
# 	return 0;
# }

def solve (x, y)
	if x > y then
		(x / y) * y * 2 + solve(x % y, y)
	elsif x == 0
		0
	else
		# s = y / x
		# s * (x + y) - (s * (s-1) / 2) * x + solve(y % x, x)
		(x + y) + solve(y-x, x)
	end
end

$n, $x = gets.chomp.split(' ').map{|i| i.to_i(10)}

puts ($x + solve($x, $n - $x))