mini notes

競技プログラミングの解法メモを残していきます。

ABC168 E - ∙ (Bullet)

問題:E - ∙ (Bullet)

解答:Submission #19557514 - AtCoder Beginner Contest 168

解法:美味しさA、香り高さBのイワシを(A, B)と表記する。

(0, 0)のイワシはどのイワシとも一緒にクーラーボックスに入れない。よって(0, 0)のイワシは別に考え、最終的な答えに(0, 0)のイワシの匹数を足せばよい。

Ai * Aj +Bi * Bj = 0の等式が成り立つ(Ai, Bi), (Aj, Bj)に対して、(Ai, Bi)の(同符号の)倍数・約数、(Aj, Bj)の(同符号の)倍数・約数に変えても等式が成り立つことは変わらない。よって、di = gcd(Ai, Bi)とし(Ai, Bi)を(Ai / d, Bi / d)に置き換えてグループ化して考えてよい。また、Ai = 0かつBi ≠ 0のイワシはAj ≠ 0 かつBj = 0のイワシとのみ仲が悪い。よって前者を(1, 0)、後者を(0, 1)としてグループ化する。

クーラーボックスに一緒に入れることができるイワシの組み合わせを考える。このとき仲が悪い同士のグループをペアにして考える。異なるペア間では入れ方は独立して決めることができ、組み合わせの数は掛け算となる。同じペア同士では、片方のグループのイワシが入るともう片方のイワシが入らないという関係性がある。グループAとグループBがペアになっている(仲が悪い同士)とすると、このペアのイワシの組み合わせ数は2 ^ |A| + 2 ^ |B| - 1となる。

なお、各ペアの組み合わせを考えるときにはイワシが全く入らないケースも考慮し、最後にその場合を取り除くことに注意する。