以下の条件を全て満たす a,b の組を一つ求める問題です。
- a×b=N
- 2≤a
- 2≤b
- a,b は整数
そのような a,b の組が存在するとき、min(a,b) の上限を見積もってみましょう。
これは、min(a,b)≤⌊N⌋ です。
これは、以下のように証明できます。
任意の正整数 1≤N≤1012 に対して、 a×b=N かつ a,b≥2 を満たす整数組 a,b が存在するとします。このとき、min(a,b)≤⌊N⌋ であることを証明します。
証明
- 仮に min(a,b)>N と仮定します。すると、 a>N かつ b>N となります。
- この場合、 a×b>N×N=N となります。しかし、これは a×b=N に矛盾します。
- 矛盾が生じたため、仮定が間違っていることが分かります。したがって、 min(a,b)≤Nとなります。
- min(a,b) は整数であるため、min(a,b)≤⌊N⌋ が成り立ちます。
以上より、1≤N≤1012 、 a×b=N 、 a,b≥2 を満たす a,b に対して、 min(a,b)≤⌊N⌋ であることが証明されました。
よって、a≤b としたとき、 a の取りうる値の範囲は、2≤a≤⌊N⌋ であることが分かります。また、 a を決めたとき、条件を全て満たす b が存在するかは、 N=0moda を満たすかで判定できます。
これより、2≤a≤⌊N⌋ の範囲で a を全探索することで、この問題に正解できます。
計算量は O(N) で十分高速です。
以下に Python の実装例を示します。