ABC114 : AtCoder Beginner Contest 114
- A - 753
https://atcoder.jp/contests/abc114/tasks/abc114_a
- 提出: https://atcoder.jp/contests/abc114/submissions/44147548
x == 7 || x == 5 || x == 3
- B - 754
https://atcoder.jp/contests/abc114/tasks/abc114_b
- 提出: https://atcoder.jp/contests/abc114/submissions/44147569
- 指示通りに連続する 3 文字を切り出したものを数値にして絶対値をとり、最小値を更新していけば良い
- C - 755
https://atcoder.jp/contests/abc114/tasks/abc114_c
- 提出: https://atcoder.jp/contests/abc114/submissions/44147626
- 109 は全探索できないが 39 なら全探索できる
- 末尾に 3 or 5 or 7 を追加して 357 をすべて含み N 以下かを調べていけば良い
- D - 756
https://atcoder.jp/contests/abc114/tasks/abc114_d
- 提出: https://atcoder.jp/contests/abc114/submissions/44147753
- 解説 AC (過去の提出)
1..=N
の積の約数はそれぞれに対して素因数分解すれば得られる- そこから 75 個の約数を持つものを考える
- WolframAlpha で 32400 を素因数分解させると
2^4*3^4*5^2
となる (4+1) * (4+1) * (2+1)
で 75 個3
と5
と5
や3
と5 * 5
などの組み合わせやその並び替えがある- 素数から最大で 3 つ小さいものから順に i, j, k と取るとしてその個数が 3, 5, 5 を超えるものを選ぶ
- 同様に他の組み合わせ・並び替えでも選び、数える
use std::collections::HashMap; use proconio::input; use superslice::Ext; fn prime_factorization(n: usize) -> Vec<(usize, usize)> { let mut p = vec![]; if n < 2 { return p; } let mut n = n; // shadowing for i in 2.. { if i * i > n { break; } let mut c = 0; while n % i == 0 { c += 1; n /= i; } if c > 0 { p.push((i, c)); } } if n != 1 { p.push((n, 1)); } p } fn dfs(cs: &[usize], qs: &[usize], count: &mut usize, depth: usize, start: usize) { if depth == cs.len() { *count += 1; return; } for i in start..qs.len() { if qs[i] + 1 < cs[depth] { continue; } dfs(cs, qs, count, depth + 1, i + 1); } } fn main() { input! { n: usize, }; let qs = { let mut pqs = HashMap::new(); for i in 1..=n { for (p, c) in prime_factorization(i) { *pqs.entry(p).or_insert(0) += c; } } pqs.values().copied().collect::<Vec<usize>>() }; let f = |mut cs: Vec<usize>| -> usize { let mut count = 0_usize; cs.sort(); loop { dfs(&cs, &qs, &mut count, 0, 0); if !cs.next_permutation() { break; } } count }; // p1^3 * p2^5 * p3^5 let ans = f(vec![3, 5, 5]) + f(vec![3 * 5, 5]) + f(vec![3, 5 * 5]) + f(vec![3 * 5 * 5]); println!("{}", ans); }
今日のコミット。