mayoko’s diary

プロコンとかいろいろ。

yukicoder No.278 連続する整数の和(2)

コメンタリー見てなんとなくうれしくなりました。

解法

n から始まる N 個の整数の和は,

n + (n+1) + ... + (n+N-1)
= Nn + N(N-1)/2

となります。X は, 任意の n について上記の値の約数になっていなければなりません。このような X は, N と N(N-1)/2 の最大公約数およびその約数です。よって, この約数の和を求めれば良いです。

ただ C++ だと N(N-1)/2 を求める際にオーバーフローしてしまうので偶奇で場合分けする必要があります。

ごまかして書いた python コード(あんまり慣れてないので書き方下手かも)

def gcd(a, b):
    if b==0:
        return a
    else:
        return gcd(b, a%b)

N = input()
g = N*(N-1)/2
p = gcd(g, N)
i = 1
ans = 0
while i*i <= p:
    if p%i == 0:
        ans += i
        if i*i < p:
            ans += p/i
    i += 1

print ans