-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprob77.py
60 lines (45 loc) · 860 Bytes
/
prob77.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import math
prime_list = [2]
n = 10**6
i = 3
while i <= int((n**0.5) + 1):
flag = True
for prime in prime_list:
if i%prime == 0:
flag = False
break
if flag:
prime_list.append(i)
i+=2
# dp[n][m] = dp[n][m-1] + dp[n-s[m]][m-1]
k = 10
cache = {}
def get_count(n, m):
key = "%d-%d"%(n,m)
if key in cache:
return cache[key]
if n == 0:
return 1
if m < 0:
return 0
if prime_list[m] > n:
cache[key] = get_count(n, m-1)
return cache[key]
cache[key] = get_count(n, m-1) + get_count(n-prime_list[m], m)
return cache[key]
max_m = len(prime_list)-1
while True:
if k > prime_list[-1]:
print "not found", k, prime_list[-1]
break
current_m = 0
for idx, prime in enumerate(prime_list):
if prime > k:
current_m = idx
break
ans = get_count(k, current_m)
if ans >= 5000:
print k, ans
break
print k, ans
k = k+1