正の整数に対して
なら
なら
を何回繰り返すと になるかという問題です。
この操作を1回ずつ行うと、たとえばのとき回程度になるため時間がかかりすぎます。
そこで、 の場合、 を で割った商と余りを求めます。 回の操作で、 になるので、
であれば次に と に対する操作を考えます。であれば、 回の操作後にと等しくなります。
コード例 (Julia)
function solve() # 入力 readInts() = parse.(Int,split(readline())) readInt() = parse(Int,readline()) A,B = readInts() if A < B A,B = B,A end ans = 0 while A > B d,r = divrem(A,B) if r==0 ans += d-1 A -= (d-1)*B else ans += d A,B = B,A-d*B end end println(ans) end # function solve # main solve()