2023-08-01 ABC114 A, B, C, D を解いた
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
- 10^9 は全探索できないが 3^9 なら全探索できる
- 末尾に 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);
}
今日のコミット。