085 - Multiplication 085(★4) Editorial by ngtkana
想定解法よりももっと愚直な全探索が実は通ります。
\(abc = K, 1 \le a \le b \le c\) なる \(c\) が存在するためには、\((a, b)\) が次の集合に入っていることが必要ですから、この集合を走査します。走査は2乗ループでできます。
\[ S = \left \lbrace (a, b) \in \mathbb Z ^ 2 \vert 1 \le a \le b, a b ^2 \le K \right \rbrace \]
計算量評価のために、この集合の要素数を評価します。
\[ \#S = \sum _ { a = 1 } ^ { \sqrt [ 3 ] K } \sum _ { b = a } ^ { \left \lfloor \sqrt { K / a } \right \rfloor } 1 \approx \int _ 1 ^ { \sqrt [ 3 ] K } \left \lparen \sqrt K x ^ { - 1 / 2 } - x \right \rparen dx = \left \lparen \frac 3 2 + o ( 1 ) \right \rparen K ^ { 2 / 3 } \]
従って、間に合いそうです。
use proconio::{fastout, input};
#[fastout]
fn main() {
input! { k: u64 }
let mut ans = 0;
for a in (1..).take_while(|&a| a * a * a <= k) {
for b in (a..).take_while(|&b| a * b * b <= k) {
ans += (k % (a * b) == 0) as u64;
}
}
println!("{}", ans);
}
提出 (1161 ms): https://atcoder.jp/contests/typical90/submissions/me
posted:
last update: