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: