AtCoder Beginner Contest 170 D – Not Divisible をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 170 D – Not Divisible

計算量考察……というか知識が問われる問題。解き方自体は割と素直にできる。

# AtCoder Beginner Contest 170 D - Not Divisible
# https://atcoder.jp/contests/abc170/tasks/abc170_d
# tag: 整数 倍数 計算量 コーナーケース

# この問題は、計算量を考えた時に、
# O(N + N//2 + ... + 1) = O(N logN)
# となることを知っていないと厳しい。

# 入力例にもある通り、同じ数字が存在する場合があるので、
# そこも処理してやる必要がある。

# ここではあまり速さにはこだわらず、素直な解き方で書いてみる。
# が、逆に言うとこの書き方でも十分間に合う。
from collections import Counter
def main():
N = int(input())
A = list(map(int, input().split()))

limit = max(A) + 1

# not_divisible[n] = True の時、n は問題の条件に合うとする
not_divisible = [False] * limit

cnt = Counter(A)

# 初期化。ダブっていない数字を True にセット
for a in cnt.keys():
if cnt[a] == 1:
not_divisible[a] = True

# 全ての数字について、その倍数を False にしていく
for a in cnt.keys():
for i in range(a*2, limit, a):
not_divisible[i] = False

# あとは残っているものを数えるだけ
result = sum(not_divisible)
print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です