diverta 2019 Programming Contest D – DivRem Number をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
diverta 2019 Programming Contest D – DivRem Number

一見ウッと思うが、全列挙できる問題。条件をきちんと絞り込んで計算量を減らそう。

# diverta 2019 Programming Contest D - DivRem Number
# https://atcoder.jp/contests/diverta2019/tasks/diverta2019_d
# tag: 整数 約数 約数列挙

# 商と余りを x としてみる。
# m がお気に入りの数とすると、
# mx + x = N
# x(m+1) = N
# つまり、m+1 は N の約数である必要がある。

# そこで、あらかじめ N の約数を列挙しておき、
# 1 引いた数が条件を満たすかどうかを確認していく。

def main():
N = int(input())

divisors = []

# 約数全列挙
for d in range(1, int(N**0.5)+1):
if N % d == 0:
divisors.append(d)
if d**2 != N:
divisors.append(N//d)

result = 0
for d in divisors:
# 条件を満たせば答えに足す
m = d - 1
if m == 0:
continue
if N // m == N % m:
result += m

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です