2023-09-01 ポケモンカード GB をクリアした / ABC177 A, B, C, D, E を解いた
先日『ポケモンカード GB 』をクリアした。プレイ時間は 13 時間。クリアし、プロモーションカードをコンプリートした。途中プロモーションカード (トレード) のためにメタモンを探して延々とバトルしていたので時間がかさんでいる。
デッキとしてはヒトカゲの初期デッキを簡素化したようなもの。ドローのためにマサキ・オーキドはかせあたりを限界まで足して、エネルギーリムーブやエネルギー回収などを積んだ感じ。基本的にはリザード・ウィンディのかえんほうしゃあたりの火力でなんとかする。ブーバー (どくが出る側) などでターンを稼いでみたりもした。リザードンは 2 枚さしていて火力が過剰かと思ったけど、最後の四連戦など HP の大きいポケモンを繰り返されるとリザードンの勢いでなんとかしないと厳しそうだった。個人的にはガルーラ (ドロー) が欲しかったのだけど最後まで出なかった。
ABC177 : AtCoder Beginner Contest 177
- A - Don't be late
https://atcoder.jp/contests/abc177/tasks/abc177_a
- 提出: https://atcoder.jp/contests/abc177/submissions/45106048
s * t >= d
- B - Substring
https://atcoder.jp/contests/abc177/tasks/abc177_b
- 提出: https://atcoder.jp/contests/abc177/submissions/45106193
S
の各文字を左端としてT
と一致しない文字数を数えて、その最小を求めるO(ST)
で間に合う
- C - Sum of product of pairs
https://atcoder.jp/contests/abc177/tasks/abc177_c
- 提出: https://atcoder.jp/contests/abc177/submissions/45106421
A_i * (A_{i+1} + A_{i+2} + ... + A_N)
を順に求めると良い- 最初に
A
の総和S
を求めておく S
からA_i
を取り除いたものとA_i
をかけあわせたものの総和が答えになる
- D - Friends
https://atcoder.jp/contests/abc177/tasks/abc177_d
- 提出: https://atcoder.jp/contests/abc177/submissions/45106507
- 連結成分のサイズが 1 になるようにグループを分割すると良い
- なので最初の連結成分ごとのサイズのうち最も大きい連結成分のサイズがグループすべきグループ数になる
- E - Coprime
https://atcoder.jp/contests/abc177/tasks/abc177_e
- 提出: https://atcoder.jp/contests/abc177/submissions/45106814
- テストケースが甘いのか嘘解放ぽいもので解けた
- setwise は !pairwise が分かれば gcd を前から順に求めるだけ
- pairwise は愚直にペアをつくると間に合わない
- 各要素ごとに素因数分解して出現した素数に重複がないかを調べる
- 本来ここを愚直にやると間に合わないはずだけど Rust だと愚直にやっても間に合う
- 想定解法だと「ふるい」のようなものを使って高速化するっぽい
- F - I hate Shortest Path Problem
https://atcoder.jp/contests/abc177/tasks/abc177_f
- 未着手
use std::collections::HashSet;
use proconio::input;
fn gcd(n: usize, m: usize) -> usize {
if m == 0 {
n
} else {
gcd(m, n % m)
}
}
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 main() {
input! {
n: usize,
a: [usize; n],
};
let mut pairwise = true;
let mut set = HashSet::new();
for a_i in a.iter().copied() {
for (p, _) in prime_factorization(a_i) {
if !set.insert(p) {
pairwise = false;
break;
}
}
}
let mut g_a = a[0];
for a_i in a.iter().copied() {
g_a = gcd(g_a, a_i);
}
let setwise = !pairwise && g_a == 1;
let ans = if pairwise {
"pairwise coprime"
} else if setwise {
"setwise coprime"
} else {
"not coprime"
};
println!("{}", ans);
}
今日のコミット。
- kireta 1 commit
- rust-atcoder 1 commit