Project Euler 204

type 以下の素数のリストをエラトステネスの篩で作る.

その素数のみの積で表される数のうちlimit = 10**9を超えない数を数え上げれば良い.

もっとも小さい素数は2であり2**n で始めてlimit を越えるのはn = 30であるので, 素数のリストから30個重複を許さない組み合わせをとり,それの積をとり上の条件を適用する.

 

for i in range(30+1):

for j in itertools.combinations_with_replacement([2,3,...,97],n):

if 積(j) <= limit: count += 1

else: break

最初はこの方法で行こうとしたのだが, break しちゃいけないことに気づいた. 

積(13,19,19,19,19) > 10**9

だがその次の

積(17,17,17,17,17) < 10**9

であることに気づいた.

combinations_with_replacement()の使い方に気をつけたいと思った.

つまりbreakは不要となるのでこの方法では時間的に無理だと判明した.

 

結局おこなったことは各1<= n <= 10**9について素因数分解して素因数が1またはtype以下のモノだけで構成されているかを調べた.