競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 292C

ABC292C

何を全探索するか,探索する範囲を小さくすること, 前計算すること. 基本通りにやればAC.

まず \(a,b,c,d\) のどれかを \(N\) の範囲で全探索する. 次に \(b\)は \(N/a\) 程度なので, \(a,b\) で \(O(Nlog N)\) 程度. あとは, \(c,d\)を高速に数えたい. \(cd = N - ab\) であるから, 約数を求める問題に近い. \(M\) の約数を求めるときは,\(M^{1/2}\) まで求めれば良かった. それと同様にして, \(M \leq N\) に対して \(cd = M\) となる個数を 前計算すれば \(O(M^{1/2})\) . 前計算するときは \(c \leq d\) を仮定することで \(O(M^{1/2}\) で求まる. 注意は, \(c = d\)のときの数え方. \(c < d\) のときは2倍だが, \(c = d\) のときは1倍.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"