Module d

Module d 

Expand description

§ABC 342 D - Square Pair

refs: https://atcoder.jp/contests/abc342/tasks/abc342_d

平方数は素因数分解した際の因数の乗数がすべて偶数になる数. 乗数が奇数の因数だけが残るように事前処理しておくと, この処理後の値が同一 = 乗数が奇数となる因数が完全に合致する数なので, 乗算後の値が平方数になる.

処理後の数が同一になるものが N 個の場合, そこから 2 つ選択する組み合わせは $N \times (N - 2) / 2 $ で算出できる. 値が 0 である場合のみ, どの数と乗算しても平方数になるため例外処理が必要.

use std::collections::HashMap;

use proconio::input;

const MX: usize = 2 * 1e+5 as usize;

fn main() {
    input! {
        n: usize,
        mut a: [usize; n],
    }

    let sq = square_num();

    for ai in a.iter_mut() {
        for &si in sq.iter() {
            if *ai % si == 0 {
                *ai /= si;
            }
        }
    }

    let mut map = HashMap::new();

    for ai in a {
        *map.entry(ai).or_insert(0usize) += 1;
    }

    let mut ans = 0;

    for (k, v) in map {
        if k == 0 {
            ans += v * (n - v);
        }
        ans += v * (v - 1) / 2;
    }

    println!("{ans}");
}

fn square_num() -> Vec<usize> {
    let mut result = vec![];
    let mut buf = 1usize;

    while result.last().is_none() || result.last() < Some(&MX) {
        result.push(buf.pow(2));
        buf += 1;
    }

    result.reverse();
    result
}