AtCoder Beginner Contest 215 D - Coprime 2【Python】

https://atcoder.jp/contests/abc215/tasks/abc215_d

AtCoder ProblemsでDifficulty: 736、Solve Probability: 35%でした。

正数列Aを素因数分解して各素因数を一つの集合に管理し、エラトステネスのふるいを少し変えて各素因数の倍数であるものをふるい落としていくようにしたところ解くことができました。
algo-method.com

algo-method.com

N, M = map(int, input().split())
A = list(map(int, input().split()))

res = set()
def prime_factorize(N):

    # √N まで試し割っていく
    for p in range(2, N):
        # p * p <= N の範囲でよい
        if p * p > N:
            break

        # N が p で割り切れないならばスキップ
        if N % p != 0:
            continue

        # N の素因数 p に対する指数を求める
        e = 0
        while N % p == 0:

            # N を p で割る
            N //= p

        # 答えに追加
        res.add(p)

    # 素数が最後に残ることがありうる
    if N != 1:
        res.add(N)

for i in range(N):
    prime_factorize(A[i])

def edit_Eratosthenes(N):
    # テーブル
    isprime = [True] * (N+1)

    # 0を予めふるい落としておく
    isprime[0] = False

    # ふるい pはAの各素因数
    for p in sorted(list(res)):
        # すでにp の倍数であるものはスキップする
        if not isprime[p]:
            continue

        # p の倍数からラベルを剥奪
        q = p# * 2
        while q <= N:
            isprime[q] = False
            q += p

    return isprime

res2 = edit_Eratosthenes(10**5)

print(sum(res2[:M+1]))
for i in range(1, M + 1):
    if res2[i]:
        print(i)