https://atcoder.jp/contests/arc129/tasks/arc129_d
3 0 -1 -2から-1 2 -1を足していくと全て0になるということですが、逆に0から1 -2 1を足していくと3 0 -1 -2になると考えることができます。
よくあるように多項式で考えましょう。すなわち、3 0 -1 -2は、1 -2 1はと考えます。循環で考えるので、下の係数を上から借りることができるので、3 0 -1 -2をとできます。これがで割り切れればよいわけです。
ふつうに割り算すると、
なので、となります。商の係数はいくつ足したかを表すので、各係数が0以上でなければなりません。を各係数に代入すると、3-a, 4-a, 4-a, 2-aが0以上で、かつこれらの総和が操作数なので、これが最も小さくなればよいです。それはa=2のときで、操作数は5です。
これをコード化したのが以下の通りです。
# coding: utf-8 # -1+2-1 from itertools import * import sys #################### library #################### def read_int(): return int(raw_input()) def read_tuple(): return tuple(map(int, raw_input().split())) def read_list(): return list(map(int, raw_input().split())) def YesNo(b): return 'Yes' if b else 'No' #################### naive #################### #################### process #################### def read_input(): N = read_int() A = read_list() return A def F(A): def mul((a, b, c), m): return (a*m, b*m, c*m) def sub((a1, b1, c1), (a2, b2, c2)): return (a1-a2, b1-b2, c1-c2) if sum(A) != 0: return -1 # Q = A % (1-x)^2 + R R = ([(-1, 0, A[0]), (0, -1, A[1])] + [ (0, 0, a) for a in A[2:]] + [(1, 0, 0), (0, 1, 0)]) Q = [()] * len(A) for k in range(len(A)): Q[k] = R[k] R[k+1] = sub(R[k+1], mul(Q[k], -2)) R[k+2] = sub(R[k+2], mul(Q[k], 1)) if R[-1][2] % R[-1][0] != 0: return -1 c = -R[-1][2] / R[-1][0] min_a = min(q[1]*c+q[2] for q in Q) counter = 0 for q in Q: counter += q[2] + q[0] * min_a + q[1] * (c - min_a) return counter #################### main #################### A = read_input() print F(A)