AtCoder Regular Contest 129 D

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は 3x^3-x-2、1 -2 1は (1-x)^2と考えます。循環で考えるので、下の係数を上から借りることができるので、3 0 -1 -2を (3-a)x^5-bx^4-x^3-2x^2+ax+bとできます。これが (1-x)^2で割り切れればよいわけです。
ふつうに割り算すると、
 (3-a)x^5-bx^4-x^3-2x^2+ax+b = (1-x)^2((3-a)x^3+(-2a-b+6)x^2+(-3a-2b+8)x-4a-3b+8)+(-4a-4b+8)x+4a+4b-8
なので、 a+b=2となります。商の係数はいくつ足したかを表すので、各係数が0以上でなければなりません。 b=2-aを各係数に代入すると、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)