AtCoder NoviStepsを埋めてみる(11) 整数系探索問題の続きです。今回も整数系探索問題ですが、難しめの問題に挑戦することにします。

085 – Multiplication 085(★4)

085 – Multiplication 085(★4)

問題の概要

正の整数 K が与えられる。
abc = K を満たす正の整数 (a, b, c) (a ≦ b ≦ c) の組がいくつあるかを求めよ。

全探索しようとすると厳しそうですが、すべての正の整数ではなく K の約数であれば全探索できそうです。それでも三重ループにすると TLE してしまうケースがひとつだけあります。a と b が決まれば c は計算すればわかるので(K が a * b で割り切れて商が b 以上であればよい)二重ループで実装できます。

約数を全列挙する GetDivisors メソッドはここで定義 されています。

C – ABC conjecture

C – ABC conjecture

問題の概要

正の整数 N が与えられる。
A ≦ B ≦ C かつ ABC ≦ N であるような正の整数の組 (A, B, C) の個数を求めよ。

似たような問題が前にありましたが 今回は ABC = N ではなく ABC ≦ N なので全探索を頑張るしかありません。N の値が 10^11 なのでなんとかできます。

D – 2-variable Function

D – 2-variable Function

問題の概要

整数 N が与えられる。以下の条件をすべて満たす最小の整数 X を求めよ。
X は N 以上である。
非負整数 (a, b) の組であって、X = a^3 + a^2 × b + a × b^2 + b^3 を満たすようなものが存在する。

a を全探索するのですが、三乗があるので N の三乗根まででよいです。a を決め打ちしたら X を N 以上にする最小の b の値は二分探索法で求めます。a に対応する b の値が定まったら実際に X の値を計算し、そのなかから最小のものを出力します。

二分探索ではライブラリ ac-library-csharp の StlFunction.BinarySearch を使っています。

参考: ac-library-csharpを使ってみる