q=⌊XY⌋ 라고 정의하고, 케이스를 두 가지로 나눌 수 있다.
- Y(modX)≤2X
q를 이진수로 나타내면 q=i∑bi2i(bkbk−1…b0(2)) 로 나타낼 수 있으며, 이 때 모든 i=0,1,2,…,k 에 대해서 만약 bi=1이면 Y에서 X로 물을 붓고, 아니면 Z에서 X로 붓는다. ( 이 때, Y에서 부은 양은 Z에서 부은 양보다 항상 많다. )
Y:=Y(modX) 가 되고, 물의 양을 최소화시키는 위치 역시 Y가 된다. 이 때 Y≤2X 가 만족된다. 그러므로 이 과정을 거치면 최솟값의 크기가 반 이하로 줄어든다.
- Y(modX)>2X
q+1을 이진수로 나타내면q+1=i∑bi2i(bkbk−1…b0(2)) 로 나타낼 수 있으며, 이 때 모든 i=0,1,2,…,k−1 에 대해서 만약 bi=1이면 Y에서 X로 물을 붓고, 아니면 Z에서 X로 붓는다. ( 이 때, Z에서 부은 양은 Y의 전체 물의 양보다 항상 적다. )
여기서, i=k인 경우를 처리해주어야 한다. 현재 (X′,Y′)=(2kX,Y−X(q+1−2k)) 이며, 이 때 Y′를 2배 해주고 X에서 물을 퍼오면 X의 물의 양은 X−Y(modX) 가 된다. 그러므로 이 과정을 거치면 최솟값의 크기가 반 이하로 줄어든다.
result = []
numlist = list(map(int, input().split()))
numlist = [[numlist[i], i + 1] for i in range(3)]
while True:
numlist.sort()
if numlist[0][0] == 0:
break
x, y = divmod(numlist[1][0], numlist[0][0])
flag = y <= numlist[0][0] >> 1
x += flag ^ 1
while x > flag ^ 1:
if x & 1:
result.append((numlist[1][1], numlist[0][1]))
numlist[1][0] -= numlist[0][0]
numlist[0][0] <<= 1
else:
result.append((numlist[2][1], numlist[0][1]))
numlist[2][0] -= numlist[0][0]
numlist[0][0] <<= 1
x >>= 1
if flag ^ 1:
result.append((numlist[0][1], numlist[1][1]))
numlist[0][0] -= numlist[1][0]
numlist[1][0] <<= 1
print(len(result))
for i in result:
print(*i)