Loading [MathJax]/extensions/tex2jax.js

AtCoder Beginner Contest 112 D – Partition をPython3で解く

Share

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

出典:
AtCoder Beginner Contest 112 D – Partition

軽い考察さえできれば、約数列挙をすれば解けることに気づける……はず?

# AtCoder Beginner Contest 112 D - Partition
# https://atcoder.jp/contests/abc112/tasks/abc112_d
# tag: 整数 最大公約数 約数列挙 典型問題

# M は求める最大公約数で割り切れる必要がある。
# そこで、M のある約数を d とすると、
# 作成される数列は、全て d で割り切れる必要がある。
# よって、数列の合計は d * N 以上でなければならない。
# つまり、M >= d * N を満たす最大の d が答えとなる。

def main():
    N, M = map(int, input().split())

    # 約数列挙。この問題で重複を避ける意味はないが、まあ一応。
    divisors = []
    for d in range(1, int(M**0.5) + 1):
        if M % d == 0:
            divisors.append(d)
            if d * d != M:
                divisors.append(M // d)

    # 昇順にソートしておく
    divisors.sort()

    result = 1

    # 小さいものから順に、条件を満たすかどうかを確認
    for d in divisors:
        if M >= d * N:
            result = d
        # 条件を満たさなくなれば打ち切る
        else:
            break

    print(result)

main()
Share

コメントを残す

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