【Python】自然数の約数を高速で取得する方法


はじめに

こちらの記事をご覧頂きありがとうございます!!
2020年6月よりプログラミングデビューしたなかぞんです!

毎日、AtCorderのA-D問題を最低5問解くことを日課としています。

私の記事では、プログラミング初心者の目線で、
日々の日課を通じて発見した学びや苦労した事、
嬉しかった事などを発信しようと思います。

同じ初心者の方々に学びのある記事になるよう努めて参ります!
上級者の方は温かい目で見守ると共に、
プラスの知恵やアドバイスを是非ともお待ちしてます!

それでは、本日の内容に参ります!!

問題

本日の学びの元となった問題はこちら

C - Walk on Multiplication Table
https://atcoder.jp/contests/abc144/tasks/abc144_c

image.png

例題のN=10で考えてみると、iとjの候補は (1, 10) (2, 5)の2つ。
N = i * j を満たすiとjの組み合わせでi + jが最小のものを考えればよいですね。
じゃあ「約数を取得しよう!」と考えたところで、
「あれ?どうすればいいんだっけ」状態に陥る。。。笑

自然数Nの約数はこうやって取得する!!

Nが最大10**12なのでfor文で1から全探索するのは
時間がかかりすぎるので工夫が必要です。

qiita.rb
N = int(input())
divisors = []
for i in range(1, int(N**0.5)+1):
    if N % i == 0:
        divisors.append(i)
        if i != N // i:
            divisors.append(N//i)

divisors.sort()

このように√N(約数の折り返し地点)まで探索すれば
全ての約数は取得できるということがポイントですね。

最後に

こういうアルゴリズム素で気づける人になりたい。
てか気づけるやつすげえな