問題
D - 250-like Number
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
方針
結局素数かどうかの判定はしないといけない。素数判定は前に作った以下のcodeで。
import math
def is_prime(m):
if m == 1:
return False
elif m < 4:
return True
elif m % 2 == 0:
return False
elif m < 9:
return True
elif m % 3 == 0:
return False
else:
r = math.floor(math.sqrt(m))
f = 5
while f <= r:
if m % f == 0:
return False
break
elif m % (f+2) == 0:
return False
break
f += 6
return True
ここからだが、\(N \geq pq^3 \geq p^4\)なので、\(4\)乗して\(N\)を超えない素数までのリストを作っておけば良い。甘めに\(\sqrt[3]{N}\)までの中から素数をリストアップする。
素数のリストを作って、\(pq^3\)が\(N\)を超えないか判定していく。
解答
#atcoder template
def main():
import sys
input = sys.stdin.readline
#文字列入力の時は上記はerrorとなる。
#ここにコード
#input
n = int(input())
#output
#n >= pq^3 > p^4
upper_lim = int(pow(n, 1/3)) + 1
import math
def is_prime(m):
if m == 1:
return False
elif m < 4:
return True
elif m % 2 == 0:
return False
elif m < 9:
return True
elif m % 3 == 0:
return False
else:
r = math.floor(math.sqrt(m))
f = 5
while f <= r:
if m % f == 0:
return False
break
elif m % (f+2) == 0:
return False
break
f += 6
return True
prime_list = []
for i in range(1, upper_lim):
if is_prime(i):
prime_list.append(i)
answer = 0
l = len(prime_list)
for i in range(l):
for j in range(i+1, l):
if prime_list[i]*prime_list[j]**3 <= n:
answer += 1
else:
break
print(answer)
#N = 1のときなどcorner caseを確認!
if __name__ == "__main__":
main()
提出結果
Python3では全く刃が立たず。
Submission #31614778 - AtCoder Beginner Contest 250
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
PyPy3にしたところあっさりと通過。
Submission #31615409 - AtCoder Beginner Contest 250
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
感想
解き終わったあとで250の意味に気がつく(250回目のABCということね)。
数え上げの部分で二部検索を使ってもPython3では通らなかった。
コメント