Project Euler 268

プロジェクトオイラー
http://projecteuler.net/index.php?section=problems&id=268

Problem 1と似たような問題の拡張。でも4以上だから包除原理を拡張しないといけないんだが、それに手間取った。これって常識なの?


範囲が小さいときに有効なコード。


def make_primes(max_p):
def is_prime(n):
return reduce(lambda x, y: x and y,
map(lambda m: n % m, range(2, n)), True)
return filter(is_prime, range(2, max_p + 1))

N = 10 ** 6
M = 100
a = [ 0 ] * (N + 1)
for p in make_primes(M - 1):
for n in range(p, N + 1, p):
a[n] += 1
print sum(map(lambda c: c >= 4, a))