AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC142 D - Disjoint Set of Common Divisors

問題原文

atcoder.jp

問題要旨

 A,  B の公約数からなる集合であって、どの2数についても互いに素が成り立つようなものの最大の大きさを求めよ。

  •   1 \leq 1, B \leq 10^{12}

解法

4とか選んじゃうと、結局素因数に2を持つような数がもう選べなくなってしまう。結局これは2を選ぶのと変わらない。
でも、2が選べて4が選べないパターン((12, 18)とか)があるので、2を選ぶ方が損しない。
結局素数集めればいいじゃんとなって、終わり。1がOKなことには注意。

実装

素因数分解 → 集合が楽だと思う
エラトステネスの篩とかで予め素数全列挙とかしようとすると、ちょっとめんどくさいことになりそうかな(知らんけど)

A, B = map(int, input().split())


def prime_factorization(n):
    table = []
    for x in range(2, int(n ** 0.5) + 1):
        while n % x == 0:
            table.append(x)
            n //= x
    if n > 1:
        table.append(n)
    return table


A_factor = set(prime_factorization(A))
B_factor = set(prime_factorization(B))
print(len(A_factor & B_factor) + 1)

感想

素数集めたら良さそうだなと思ったら、素数集めればよかった。
証明も、「損しない」というキーワードを元に考えれば思いつける。