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