問題
考えたこと
ペアの組み合わせとしてはと、 とだけど後者のペアをなるべく作ればペアの数を増やせる。
前提条件
①
よって
②
とおく
rが平方数の場合
なのでの組を作れません。未満は使用できるので個の組を二つ作れます*1。
- の場合、が使えなため *2して。
- の場合はそのまま
rが平方数でない場合
- の場合、個の組を二つ作れます。
- そうでない場合、個の組と個の組を作れます*3。 A,Bが使えないため。 よって前者は 後者は
コード
static long Calc(long A, long B) { if (A == B) return A - 1 + B - 1; var lim = A * B; var r = (long)Sqrt(lim); if (lim < r * r) --r; if ((r + 1) * (r + 1) < lim) ++r; if (r * r == lim) return r - 1 + r - 1 - 1; var a = r + r - 1 - 1; if (r * (r + 1) < lim) ++a; return a; }
背景
わーいでクエリ処理できたメモっとこー と思ったけどを求める計算量それなりにあるよね・・・
よく読んだら解説と同じ方法っぽいことに気づいた。
その他
をペアにできてここから考えると見通しよさそうな気配。あ、途中でみたいなの出てくる・・・。
被らない条件を考えると になればいいから まで大丈夫か。・・・あっ(察し。
みたいな感じで上記解法に至りました。