├── .idea ├── .gitignore ├── misc.xml ├── vcs.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── modules.xml └── euler.iml ├── 029.py ├── 010.py ├── 071.py ├── 016.py ├── 006.py ├── 028.py ├── 048.py ├── 001.py ├── 097.py ├── 301.py ├── 020.py ├── 068.py ├── 100.py ├── 013.py ├── 117.py ├── 173.py ├── 063.py ├── 132.py ├── 056.py ├── 065.py ├── 003.py ├── 052.py ├── 120.py ├── 131.py ├── 700.py ├── 002.py ├── 025.py ├── 004.py ├── 009.py ├── 069.py ├── 007.py ├── 057.py ├── 113.py ├── 129.py ├── 187.py ├── 089.py ├── 124.py ├── 138.py ├── 034.py ├── 041.py ├── 099.py ├── 188.py ├── 123.py ├── 030.py ├── 114.py ├── 101.py ├── 106.py ├── 135.py ├── 067.py ├── 136.py ├── 684.py ├── 038.py ├── 033.py ├── 086.py ├── 119.py ├── 145.py ├── 032.py ├── 045.py ├── 076.py ├── 091.py ├── 203.py ├── 055.py ├── 686.py ├── 058.py ├── 049.py ├── 062.py ├── 019.py ├── 053.py ├── 024.py ├── 125.py ├── data ├── ep17.csv ├── ep18.txt ├── ep79.txt ├── ep08.txt ├── ep11.txt ├── ep13.txt ├── pe096.txt ├── ep67.txt ├── ep42.txt ├── ep89.txt ├── ep99.txt └── ep81.txt ├── 046.py ├── 059.py ├── 088.py ├── 070.py ├── 008.py ├── 587.py ├── 206.py ├── 115.py ├── 012.py ├── 021.py ├── 042.py ├── 118.py ├── 231.py ├── 137.py ├── 014.py ├── 023.py ├── 090.py ├── 112.py ├── 243.py ├── 022.py ├── 080.py ├── 087.py ├── 015.py ├── 134.py ├── 204.py ├── 104.py ├── 179.py ├── 075.py ├── 079.py ├── 094.py ├── 027.py ├── 072.py ├── 085.py ├── 026.py ├── 064.py ├── 510.py ├── 036.py ├── 144.py ├── 047.py ├── 719.py ├── 078.py ├── 081.py ├── 050.py ├── 044.py ├── 083.py ├── 005.py ├── 040.py ├── 082.py ├── 107.py ├── 116.py ├── 035.py ├── 043.py ├── 808.py ├── 077.py ├── 031.py ├── 051.py ├── 018.py ├── 102.py ├── 108.py ├── 110.py ├── 122.py ├── 066.py ├── 357.py ├── 143.py ├── 095.py ├── 140.py ├── 121.py ├── 060.py ├── 074.py ├── 103.py ├── 037.py ├── 105.py ├── 017.py ├── 039.py ├── 073.py ├── 160.py ├── 727.py ├── 540.py ├── 092.py ├── 061.py ├── 098.py ├── 011.py ├── 675.py ├── 093.py ├── 205.py ├── 084.py ├── README.md ├── 054.py └── 096.py /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Default ignored files 3 | /workspace.xml -------------------------------------------------------------------------------- /029.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | r = range(2,101) 4 | print len({a**b for a in r for b in r}) 5 | -------------------------------------------------------------------------------- /010.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from sympy import sieve 4 | print sum(list(sieve.primerange(1,2e6))) 5 | -------------------------------------------------------------------------------- /071.py: -------------------------------------------------------------------------------- 1 | # time cost = 408 ns ± 1.89 ns 2 | 3 | def main(D=10**6): 4 | k = int((D-5)/7) 5 | return 2+3*k 6 | -------------------------------------------------------------------------------- /016.py: -------------------------------------------------------------------------------- 1 | # time cost = 51.6 µs ± 629 ns 2 | 3 | def main(): 4 | ans = sum(map(int,str(2**1000))) 5 | return ans 6 | -------------------------------------------------------------------------------- /006.py: -------------------------------------------------------------------------------- 1 | # time cost = 569 ns ± 45.8 ns 2 | 3 | def main(n=100): 4 | ans = n*(n-1)*(n+1)*(3*n+2)/12 5 | return int(ans) 6 | -------------------------------------------------------------------------------- /028.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.47 µs ± 2.67 ns 2 | 3 | def main(n=500): 4 | res = 16*n**3/3 + 10*n**2 + 26*n/3 + 1 5 | return int(res) 6 | -------------------------------------------------------------------------------- /048.py: -------------------------------------------------------------------------------- 1 | # time cost = 9.14 ms ± 71.6 µs 2 | 3 | def main(): 4 | res = sum([x**x for x in range(1,1001)]) 5 | return (res % 10**10) 6 | -------------------------------------------------------------------------------- /001.py: -------------------------------------------------------------------------------- 1 | # time cost = 123 µs ± 15.4 µs 2 | 3 | def main(): 4 | ans = sum([x for x in range(1,1000) if x%3==0 or x%5==0]) 5 | return ans 6 | -------------------------------------------------------------------------------- /097.py: -------------------------------------------------------------------------------- 1 | # ans = 8739992577, time cost = 5.15 µs 2 | 3 | def main(): 4 | res = (28433*pow(2,7830457,10**10)+1)%(10**10) 5 | return res 6 | -------------------------------------------------------------------------------- /301.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.51 µs ± 31.6 ns 2 | 3 | def main(N=30): 4 | a,b = 1,2 5 | for _ in range(N): 6 | a,b = b,a+b 7 | return a 8 | -------------------------------------------------------------------------------- /020.py: -------------------------------------------------------------------------------- 1 | # time cost = 27.2 µs ± 149 ns 2 | 3 | from math import factorial as fac 4 | 5 | def main(): 6 | ans = sum(map(int,str(fac(100)))) 7 | return ans 8 | -------------------------------------------------------------------------------- /068.py: -------------------------------------------------------------------------------- 1 | # this problem can be solved with pen and paper, no programming is required. 2 | # see https://www.cnblogs.com/metaquant/p/11957802.html for an explanation 3 | -------------------------------------------------------------------------------- /100.py: -------------------------------------------------------------------------------- 1 | # time cost = 5.73 µs ± 59.8 ns 2 | 3 | def main(N=10**12): 4 | b,t = 15,21 5 | while t < N: 6 | b,t = 2*t+3*b-2,3*t+4*b-3 7 | return b 8 | -------------------------------------------------------------------------------- /013.py: -------------------------------------------------------------------------------- 1 | # time cost = 159 µs ± 858 ns 2 | 3 | def main(): 4 | large_sum = sum(map(int,open('data/ep13.txt'))) 5 | ans = str(large_sum)[:10] 6 | return ans 7 | -------------------------------------------------------------------------------- /117.py: -------------------------------------------------------------------------------- 1 | # time cost = 16.9 µs ± 82.7 ns 2 | 3 | def main(n=50): 4 | arr = [1,2,4,8] 5 | for _ in range(n-4): 6 | arr.append(sum(arr[-4:])) 7 | return arr[-1] 8 | -------------------------------------------------------------------------------- /173.py: -------------------------------------------------------------------------------- 1 | # time cost = 45.8 µs ± 293 ns 2 | 3 | def main(N=10**6): 4 | side = N//4 5 | u = int(side**0.5) + 1 6 | res = sum((side//i-i for i in range(1,u))) 7 | return res 8 | -------------------------------------------------------------------------------- /063.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.8 µs ± 29.8 ns 2 | 3 | from math import log10 4 | 5 | def main(): 6 | c = 0 7 | for n in range(1,10): 8 | c += int(1/(1-log10(n))) 9 | return c 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /132.py: -------------------------------------------------------------------------------- 1 | # time cost = 242 ms ± 488 µs 2 | 3 | from sympy import primerange 4 | 5 | def main(N=10**9,k=40): 6 | primes = [p for p in primerange(7,200000) if pow(10,N,p)==1] 7 | return sum(primes[:k]) 8 | -------------------------------------------------------------------------------- /056.py: -------------------------------------------------------------------------------- 1 | # time cost = 190 ms ± 515 µs 2 | 3 | def main(): 4 | str_sum = lambda y : sum([int(x) for x in str(y)]) 5 | res = max([str_sum(a**b) for a in range(1,100) for b in range(1,100)]) 6 | return res 7 | -------------------------------------------------------------------------------- /065.py: -------------------------------------------------------------------------------- 1 | # time cost = 30.8 µs ± 113 ns 2 | 3 | def main(N=100): 4 | m,n = 1,2 5 | for i in range(2,N+1): 6 | a = 2 * i//3 if i%3==0 else 1 7 | m,n = n,m+a*n 8 | return sum(map(int,str(n))) 9 | -------------------------------------------------------------------------------- /003.py: -------------------------------------------------------------------------------- 1 | # time cost = 238 µs ± 789 ns 2 | 3 | def main(n=600851475143): 4 | i = 2 5 | while i * i < n: 6 | while n%i == 0: 7 | n /= i 8 | i += 2 if i>2 else 1 9 | return n 10 | -------------------------------------------------------------------------------- /052.py: -------------------------------------------------------------------------------- 1 | # time cost = 314 ms ± 5.06 ms 2 | 3 | from itertools import count 4 | 5 | def main(): 6 | for x in count(10,1): 7 | if all(set(str(k*x))==set(str(x)) for k in range(6,1,-1)): 8 | return x 9 | -------------------------------------------------------------------------------- /120.py: -------------------------------------------------------------------------------- 1 | # time cost = 617 µs ± 1.28 µs 2 | 3 | def main(): 4 | even = [a**2-2*a for a in range(3,1001) if a%2==0] 5 | odd = [a**2-a for a in range(3,1001) if a%2==1] 6 | ans = sum(even) + sum(odd) 7 | return ans 8 | -------------------------------------------------------------------------------- /131.py: -------------------------------------------------------------------------------- 1 | # time cost = 8.71 ms ± 878 µs 2 | 3 | from sympy import isprime 4 | 5 | def main(N=576): 6 | c = 0 7 | for i in range(1,N+1): 8 | if isprime(3*i**2+3*i+1): 9 | c += 1 10 | return c 11 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /700.py: -------------------------------------------------------------------------------- 1 | # time cost = 12.8 µs ± 176 ns 2 | 3 | def main(): 4 | c = 1504170715041707 5 | nc = 8912517754604 6 | res = c + nc 7 | while nc > 0: 8 | c,nc = nc,(-c)%nc 9 | res += nc 10 | return res 11 | -------------------------------------------------------------------------------- /002.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.75 µs ± 75.2 ns 2 | 3 | def main(N=4e6): 4 | a,b = 2,8 5 | arr = [a,b] 6 | while True: 7 | a,b = b,4*b+a 8 | arr.append(b) 9 | if b > N: 10 | return sum(arr[:-1]) 11 | -------------------------------------------------------------------------------- /025.py: -------------------------------------------------------------------------------- 1 | # time cost = 40.2 ms ± 412 µs 2 | 3 | def main(N=1000): 4 | a,b,n = 1,1,1 5 | while True: 6 | n += 1 7 | a,b = b,a+b 8 | if len(str(a)) == N: 9 | return n 10 | -------------------------------------------------------------------------------- /004.py: -------------------------------------------------------------------------------- 1 | # time cost = 169 ms ± 402 µs 2 | 3 | def main(): 4 | r = range(999,99,-1) 5 | is_palindrome = lambda x : str(x) == str(x)[::-1] 6 | ans = max([i*j for i in r for j in r if (i*j)%11==0 and is_palindrome(i*j)]) 7 | return ans 8 | -------------------------------------------------------------------------------- /009.py: -------------------------------------------------------------------------------- 1 | # time cost = 146 µs ± 791 ns 2 | 3 | def main(p=1000): 4 | for a in range(1,p//3): 5 | n,d = p**2-2*p*a,2*p-2*a 6 | if n % d == 0: 7 | b = n/d 8 | c = p-a-b 9 | return int(a*b*c) 10 | -------------------------------------------------------------------------------- /069.py: -------------------------------------------------------------------------------- 1 | # time cost = 6.91 ms ± 154 µs 2 | 3 | from sympy import prime 4 | 5 | def main(N=10**6): 6 | i,prod,arr = 1,1,[] 7 | while prod <= N: 8 | prod *= prime(i) 9 | arr.append(prod) 10 | i += 1 11 | return arr[-2] 12 | -------------------------------------------------------------------------------- /007.py: -------------------------------------------------------------------------------- 1 | # time cost = 197 ms ± 1.18 ms 2 | 3 | from sympy import primerange 4 | from math import log,ceil 5 | 6 | def main(n=10001): 7 | upper_bound = ceil((log(n)+log(log(n))) * n) 8 | primes = list(primerange(1,upper_bound)) 9 | return primes[n-1] 10 | -------------------------------------------------------------------------------- /057.py: -------------------------------------------------------------------------------- 1 | # time cost = 885 µs ± 9.93 µs 2 | 3 | from math import log10 4 | 5 | def main(N=1000): 6 | c,n,d = 0,1,1 7 | for i in range(N): 8 | n,d = 2 * d + n,d + n 9 | if int(log10(n)) > int(log10(d)): 10 | c += 1 11 | return c 12 | -------------------------------------------------------------------------------- /113.py: -------------------------------------------------------------------------------- 1 | # time cost = 8.51 µs ± 116 ns 2 | 3 | from math import factorial as fac 4 | 5 | def comb_num(n,k): 6 | num = fac(n)//(fac(n-k)*fac(k)) 7 | return num 8 | 9 | def main(d=100): 10 | res = comb_num(d+9,9)+comb_num(d+10,10)-10*d-2 11 | return res 12 | -------------------------------------------------------------------------------- /129.py: -------------------------------------------------------------------------------- 1 | # time cost = 642 µs ± 2.22 µs 2 | 3 | from sympy.ntheory import n_order 4 | 5 | def main(N=10**6): 6 | n = N + 1 7 | while True: 8 | if n % 5 != 0 and n_order(10,9*n)>N: 9 | return n 10 | else: 11 | n = n + 2 12 | -------------------------------------------------------------------------------- /187.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.51 s ± 5.57 ms 2 | 3 | from sympy import primerange,primepi 4 | 5 | def main(N=10**8): 6 | c = 0 7 | u = int(N**0.5) 8 | primes = primerange(1,u+1) 9 | for n,p in enumerate(primes): 10 | c += primepi((N-1)//p)-n 11 | return c 12 | -------------------------------------------------------------------------------- /089.py: -------------------------------------------------------------------------------- 1 | # time cost = 565 µs ± 11.4 µs 2 | 3 | import re 4 | 5 | def main(): 6 | with open('data/ep89.txt') as f: 7 | romans = f.read() 8 | new = re.sub("DCCCC|LXXXX|VIIII|CCCC|XXXX|IIII", '**',romans) 9 | savings = len(romans) - len(new) 10 | return savings 11 | -------------------------------------------------------------------------------- /124.py: -------------------------------------------------------------------------------- 1 | # time cost = 153 ms ± 1.19 ms 2 | 3 | def main(n=10**5,k=10**4): 4 | arr = [[1,i] for i in range(n+1)] 5 | for i in range(2,n+1): 6 | if arr[i][0] == 1: 7 | for j in range(i,n+1,i): 8 | arr[j][0] *= i 9 | return sorted(arr)[k][1] 10 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /138.py: -------------------------------------------------------------------------------- 1 | # time cost = 6.96 µs ± 23.6 ns 2 | 3 | def main(N=12): 4 | n,res = 0,0 5 | x,y = 38,17 6 | while n < N: 7 | b1,b2 = 2*x+4,2*x-4 8 | if b1%5 == 0 or b2%5==0: 9 | res += y 10 | n += 1 11 | x,y = 9*x+20*y,4*x+9*y 12 | return res 13 | -------------------------------------------------------------------------------- /034.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.22 s ± 3.31 ms 2 | 3 | from math import factorial 4 | 5 | def main(): 6 | fac_dict = {str(n):factorial(n) for n in range(10)} 7 | res = 0 8 | for i in range(10,2177282): 9 | if sum([fac_dict[x] for x in str(i)]) == i: 10 | res += i 11 | return res 12 | -------------------------------------------------------------------------------- /041.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.92 ms ± 111 µs 2 | 3 | from sympy import prevprime 4 | 5 | def main(): 6 | start = 7654321 7 | while True: 8 | prevp = prevprime(start) 9 | if set(str(prevp)) == set('1234567'): 10 | return prevp 11 | else: 12 | start = prevp 13 | -------------------------------------------------------------------------------- /099.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.51 ms ± 24.9 µs 2 | 3 | from math import log10 4 | 5 | def main(): 6 | with open('data/ep99.txt') as f: 7 | pairs = [list(map(int,s.split(','))) for s in f.readlines()] 8 | log_pairs = [x[1]*log10(x[0]) for x in pairs] 9 | return log_pairs.index(max(log_pairs))+1 10 | -------------------------------------------------------------------------------- /188.py: -------------------------------------------------------------------------------- 1 | # time cost = 31.9 µs ± 78.6 ns 2 | 3 | from sympy.ntheory import totient 4 | 5 | def main(b=1777,e=1855,m=10**8): 6 | res,phis = 1,[m] 7 | while m != 1: 8 | m = totient(m) 9 | phis.append(m) 10 | for phi in reversed(phis): 11 | res = pow(b,res,phi) 12 | return res 13 | -------------------------------------------------------------------------------- /123.py: -------------------------------------------------------------------------------- 1 | # time cost = 358 ms ± 3.45 ms 2 | 3 | from sympy import nextprime 4 | 5 | def main(N=10**10): 6 | n,p = 7037,71059 7 | while True: 8 | np = nextprime(p,2) 9 | n = n + 2 10 | r = 2*n*np 11 | if r > N: 12 | return n 13 | else: 14 | p = np 15 | -------------------------------------------------------------------------------- /030.py: -------------------------------------------------------------------------------- 1 | # time cost = 761 ms ± 19.2 ms 2 | 3 | def main(): 4 | power_dict = {i:i**5 for i in range(0,10)} 5 | res = [] 6 | for i in range(10,6*9**5): 7 | sum_of_digits = sum([power_dict[int(x)] for x in str(i)]) 8 | if i == sum_of_digits: 9 | res.append(i) 10 | return sum(res) 11 | -------------------------------------------------------------------------------- /114.py: -------------------------------------------------------------------------------- 1 | # time cost = 186 ns ± 1.67 ns 2 | 3 | from functools import lru_cache 4 | 5 | @lru_cache(maxsize=None) 6 | def f(n,m): 7 | if n < m: 8 | return 1 9 | elif n == m: 10 | return 2 11 | else: 12 | return 2*f(n-1,m)-f(n-2,m)+f(n-m-1,m) 13 | 14 | def main(): 15 | return f(50,3) 16 | -------------------------------------------------------------------------------- /101.py: -------------------------------------------------------------------------------- 1 | # time cost = 22.6 µs ± 87 ns 2 | 3 | def main(): 4 | res = 0 5 | tdp = lambda x: (x**11+1)//(x+1) 6 | arr = [tdp(x) for x in range(1,11)] 7 | diff = lambda arr:[x-y for x,y in zip(arr[1:],arr[:-1])] 8 | for _ in range(10): 9 | res += sum(arr) 10 | arr = diff(arr) 11 | return res 12 | -------------------------------------------------------------------------------- /106.py: -------------------------------------------------------------------------------- 1 | # time cost = 6.35 µs ± 191 ns 2 | 3 | from math import factorial as fac 4 | 5 | def comb_num(n,k): 6 | num = fac(n)//(fac(n-k)*fac(k)) 7 | return num 8 | 9 | def main(N=12): 10 | res = 0 11 | for i in range(1,N//2+1): 12 | res += comb_num(N,2*i)*(comb_num(2*i,i)//2-comb_num(2*i,i)//(i+1)) 13 | return res 14 | -------------------------------------------------------------------------------- /135.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.21 s ± 5.8 ms 2 | 3 | from collections import defaultdict 4 | 5 | def main(N=10**6): 6 | res = defaultdict(int) 7 | for a in range(2,N+1): 8 | u = min(a,(N+a**2)//(4*a)+1) 9 | for d in range(a//4+1,u): 10 | res[a*(4*d-a)] += 1 11 | return len([k for k,v in res.items() if v==10]) 12 | -------------------------------------------------------------------------------- /067.py: -------------------------------------------------------------------------------- 1 | # time cost = 3.18ms 2 | 3 | with open('euler/ep67.txt') as f: 4 | table = [list(map(int,s.split())) for s in f.readlines()] 5 | 6 | def main(): 7 | for row in range(len(table)-1, 0, -1): 8 | for col in range(0, row): 9 | table[row-1][col] += max(table[row][col], table[row][col+1]) 10 | return table[0][0] 11 | -------------------------------------------------------------------------------- /136.py: -------------------------------------------------------------------------------- 1 | # time cost = 1min 30s ± 4.84 s 2 | 3 | from collections import defaultdict 4 | 5 | def main(N=5*10**7): 6 | res = defaultdict(int) 7 | for a in range(2,N+1): 8 | u = min(a,(N+a**2)//(4*a)+1) 9 | for d in range(a//4+1,u): 10 | res[a*(4*d-a)] += 1 11 | return len([k for k,v in res.items() if v==1]) 12 | -------------------------------------------------------------------------------- /684.py: -------------------------------------------------------------------------------- 1 | # time cost = 271 µs ± 3.42 µs 2 | 3 | def s(k,r,m=10**9+7): 4 | res = ((r+1)*(r+2)//2+5)*pow(10,k,m)-9*k-6-r 5 | return res 6 | 7 | def main(n=90): 8 | fib = [0,1] 9 | for _ in range(n-1): 10 | fib.append(sum(fib[-2:])) 11 | res = [s(*divmod(fib[i],9)) for i in range(2,n+1)] 12 | return sum(res)%(10**9+7) 13 | -------------------------------------------------------------------------------- /038.py: -------------------------------------------------------------------------------- 1 | # time cost = 360 µs ± 3.8 µs 2 | 3 | def is_pandgital(x): 4 | digits_set = set(str(x)) 5 | if digits_set == set(str(123456789)): 6 | return True 7 | return False 8 | 9 | def main(): 10 | for p in range(9487,9233,-1): 11 | ans = int(str(p) + str(p*2)) 12 | if is_pandgital(ans): 13 | return ans 14 | -------------------------------------------------------------------------------- /033.py: -------------------------------------------------------------------------------- 1 | # ans = 100, time cost = 33.7 µs 2 | 3 | from math import gcd 4 | 5 | def main(): 6 | nom,den = 1,1 7 | for i in range(1,10): 8 | for d in range(1,i): 9 | for n in range(1,d): 10 | if d*(10*n+i) == n*(10*i+d): 11 | nom *= n 12 | den *= d 13 | return den//gcd(nom,den) 14 | -------------------------------------------------------------------------------- /086.py: -------------------------------------------------------------------------------- 1 | # time cost = 3.85 s ± 3.71 ms 2 | 3 | def main(N=10**6): 4 | c,length = 0,2 5 | while c < N: 6 | length = length + 1 7 | for wph in range(3,2*length): 8 | sq = (length**2 + wph**2)**0.5 9 | if sq % 1 == 0: 10 | c += (wph//2) if length>wph else (length-(wph+1)//2+1) 11 | return length 12 | -------------------------------------------------------------------------------- /119.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.68 ms ± 16.7 µs per 2 | 3 | def main(k=30): 4 | arr = [] 5 | for b in range(2,100): 6 | for p in range(2,10): 7 | n = b ** p 8 | if n > 10: 9 | ds = sum([int(x) for x in str(n)]) 10 | if ds == b: 11 | arr.append(n) 12 | return sorted(arr)[k-1] 13 | -------------------------------------------------------------------------------- /145.py: -------------------------------------------------------------------------------- 1 | # time cost = 4.89 µs ± 19 ns 2 | 3 | def reversible_numbers(d): 4 | r = d % 4 5 | if r == 0 or r == 2: 6 | return 20*30**(d//2-1) 7 | elif r == 3: 8 | return 100*(500)**((d-3)//4) 9 | else: 10 | return 0 11 | 12 | def main(): 13 | ans = sum([reversible_numbers(x) for x in range(2,10)]) 14 | return ans 15 | -------------------------------------------------------------------------------- /032.py: -------------------------------------------------------------------------------- 1 | # time cost = 49.6 ms ± 443 µs 2 | 3 | def main(): 4 | res = set() 5 | for i in range(1,100): 6 | start = 1234 if i <=9 else 123 7 | for j in range(start,10000//i): 8 | s = str(i) + str(j) + str(i*j) 9 | if len(s) == 9 and set(s) == set('123456789'): 10 | res.add(i*j) 11 | return sum(res) 12 | -------------------------------------------------------------------------------- /045.py: -------------------------------------------------------------------------------- 1 | # time cost = 18.1 ms ± 30.1 µs 2 | 3 | from math import sqrt 4 | 5 | def is_pantagon(x): 6 | if (sqrt(24*x+1)+1) % 6 == 0: 7 | return True 8 | return False 9 | 10 | def main(): 11 | i = 144 12 | while True: 13 | h = i*(2*i-1) 14 | if is_pantagon(h): 15 | return h 16 | else: 17 | i += 1 18 | -------------------------------------------------------------------------------- /076.py: -------------------------------------------------------------------------------- 1 | # time cost = 2ms 2 | 3 | from functools import lru_cache 4 | 5 | @lru_cache(maxsize=2048) 6 | def partition(i,j): 7 | if i == 1 or j == 1: 8 | return 1 9 | elif i <= j: 10 | return partition(i,i-1)+1 11 | else: 12 | return partition(i,j-1) + partition(i-j,j) 13 | 14 | def main(N=100): 15 | return partition(N,N-1) 16 | -------------------------------------------------------------------------------- /091.py: -------------------------------------------------------------------------------- 1 | # time cost = 3.28 ms ± 59.5 µs 2 | 3 | from math import gcd 4 | 5 | def main(N=50): 6 | count = 0 7 | for x in range(1,N+1): 8 | for y in range(1,N+1): 9 | g = gcd(x,y) 10 | low = max(-g*x/y,(y-N)*g/x) 11 | up = min(g*(N-x)/y,g*y/x) 12 | count += (int(up)-int(low)) 13 | return count + 3*50**2 14 | -------------------------------------------------------------------------------- /203.py: -------------------------------------------------------------------------------- 1 | # time cost = 465 µs ± 3.78 µs 2 | 3 | def main(n=51): 4 | squares = [4,9,25,49] 5 | res = set() 6 | pt = [1,1] 7 | for r in range(n-2): 8 | pt = [x+y for x,y in zip(pt+[0],[0]+pt)] 9 | for comb in pt[:(r+3)//2+2]: 10 | if all([comb%s for s in squares]) != 0: 11 | res.add(comb) 12 | return sum(res) 13 | -------------------------------------------------------------------------------- /055.py: -------------------------------------------------------------------------------- 1 | # time cost = 64.8 ms ± 229 µs 2 | 3 | def is_lychrel(x): 4 | is_palindrome = lambda x : str(x) == str(x)[::-1] 5 | for _ in range(50): 6 | x += int(str(x)[::-1]) 7 | if is_palindrome(x): 8 | return False 9 | return True 10 | 11 | def main(): 12 | ans = len([x for x in range(1,10000) if is_lychrel(x)]) 13 | return ans 14 | -------------------------------------------------------------------------------- /686.py: -------------------------------------------------------------------------------- 1 | # time cost = 428 ms ± 4.64 ms 2 | 3 | from numba import njit 4 | 5 | @njit 6 | def nth_start_with(target=123,N=678910): 7 | n,power,k = 0,2,1 8 | while n= 10**3: 11 | power = power / 10.0 12 | if int(power) == target: 13 | n = n + 1 14 | k = k + 1 15 | return k 16 | -------------------------------------------------------------------------------- /058.py: -------------------------------------------------------------------------------- 1 | # time cost = 276 ms ± 1.39 ms 2 | 3 | from itertools import count 4 | from sympy import isprime 5 | 6 | def main(): 7 | k = 0 8 | for i in count(3,2): 9 | a = i**2 - (i-1) 10 | b = a - (i-1) 11 | c = b - (i-1) 12 | k += len([x for x in [a,b,c] if isprime(x)]) 13 | n = 2 * i - 1 14 | if k/n < 0.1: 15 | return i 16 | -------------------------------------------------------------------------------- /049.py: -------------------------------------------------------------------------------- 1 | # time cost = 3.8 ms ± 549 µs 2 | 3 | from sympy import isprime,primerange 4 | 5 | def main(): 6 | primes = primerange(1000,10000) 7 | for p in primes: 8 | if p != 1487: 9 | a = p + 3330 10 | b = p + 6660 11 | if isprime(a) and isprime(b) and set(str(p))==set(str(a))==set(str(b)): 12 | return str(p) + str(a) + str(b) 13 | -------------------------------------------------------------------------------- /062.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.65 s ± 7.11 ms 2 | 3 | from itertools import count 4 | 5 | perm = lambda x : "".join(sorted(str(x))) 6 | 7 | def cubic_perm(res): 8 | for i in count(5,1): 9 | c = perm(i**3) 10 | if len([x for x in res if x==c]) == 5: 11 | return i**3 12 | 13 | def main(): 14 | res = [perm(i**3) for i in range(5,10001)] 15 | return cubic_perm(res) 16 | -------------------------------------------------------------------------------- /019.py: -------------------------------------------------------------------------------- 1 | # time cost = 6.46 ms ± 10.9 µs 2 | 3 | import datetime as dt 4 | 5 | def count_sundays(): 6 | delta = dt.timedelta(days=1) 7 | start_date = dt.datetime(1901, 1, 1) 8 | end_date = dt.datetime(2000, 12, 31) 9 | count = 0 10 | while start_date <= end_date: 11 | if start_date.day==1 and start_date.isoweekday()==7: count+=1 12 | start_date += delta 13 | return count 14 | -------------------------------------------------------------------------------- /053.py: -------------------------------------------------------------------------------- 1 | # time cost = 997 µs ± 5.72 µs 2 | 3 | from math import factorial as fac 4 | 5 | def comb_num(n,k): 6 | num = fac(n)/(fac(n-k)*fac(k)) 7 | return num 8 | 9 | def main(): 10 | count = 0 11 | for n in range(23,101): 12 | for r in range(1,n//2): 13 | if comb_num(n,r) > 10**6: 14 | count += (n - 2*r + 1) 15 | break 16 | return count 17 | -------------------------------------------------------------------------------- /024.py: -------------------------------------------------------------------------------- 1 | # time cost = 280 ns ± 1.51 ns 2 | 3 | from math import factorial as fac 4 | from functools import lru_cache 5 | 6 | @lru_cache(maxsize=128) 7 | def nth_lexi_perm(n,s): 8 | if len(s) == 1: 9 | return s 10 | else: 11 | q,r = divmod(n,fac(len(s)-1)) 12 | return (s[q] + nth_lexi_perm(r,s[:q]+s[q+1:])) 13 | 14 | def main(n=10**6,s='0123456789'): 15 | return nth_lexi_perm(n-1,s) 16 | -------------------------------------------------------------------------------- /125.py: -------------------------------------------------------------------------------- 1 | # time cost = 224 ms ± 1.35 ms 2 | 3 | def is_palindromic(n): 4 | n = str(n) 5 | return n == n[::-1] 6 | 7 | def main(N=10**8): 8 | psos = set() 9 | u = int((N/2)**0.5) 10 | for i in range(1,u): 11 | sos = i*i 12 | while sos < N: 13 | i += 1 14 | sos += i*i 15 | if is_palindromic(sos): 16 | psos.add(sos) 17 | return sum(psos) 18 | -------------------------------------------------------------------------------- /data/ep17.csv: -------------------------------------------------------------------------------- 1 | 1,one 2 | 2,two 3 | 3,three 4 | 4,four 5 | 5,five 6 | 6,six 7 | 7,seven 8 | 8,eight 9 | 9,nine 10 | 10,ten 11 | 11,eleven 12 | 12,twelve 13 | 13,thirteen 14 | 14,fourteen 15 | 15,fifteen 16 | 16,sixteen 17 | 17,seventeen 18 | 18,eighteen 19 | 19,nineteen 20 | 20,twenty 21 | 30,thirty 22 | 40,forty 23 | 50,fifty 24 | 60,sixty 25 | 70,seventy 26 | 80,eighty 27 | 90,ninety 28 | 100,onehundred 29 | 1000,onethousand 30 | -------------------------------------------------------------------------------- /data/ep18.txt: -------------------------------------------------------------------------------- 1 | 75 2 | 95 64 3 | 17 47 82 4 | 18 35 87 10 5 | 20 04 82 47 65 6 | 19 01 23 75 03 34 7 | 88 02 77 73 07 63 67 8 | 99 65 04 28 06 16 70 92 9 | 41 41 26 56 83 40 80 70 33 10 | 41 48 72 33 47 32 37 16 94 29 11 | 53 71 44 65 25 43 91 52 97 51 14 12 | 70 11 33 28 77 73 17 78 39 68 17 57 13 | 91 71 52 38 17 14 91 43 58 50 27 29 48 14 | 63 66 04 68 89 53 67 30 73 16 69 87 40 31 15 | 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 -------------------------------------------------------------------------------- /046.py: -------------------------------------------------------------------------------- 1 | # time cost = 19.7 ms ± 199 µs 2 | 3 | from math import sqrt 4 | from sympy import isprime 5 | 6 | def nonexist(x): 7 | limit = int(sqrt((x-1)/2)) 8 | for i in range(1,limit+1): 9 | if isprime(x-2*i**2): 10 | return False 11 | return True 12 | 13 | def main(): 14 | i = 35 15 | while True: 16 | if not isprime(i) and nonexist(i): 17 | return i 18 | i += 2 19 | -------------------------------------------------------------------------------- /059.py: -------------------------------------------------------------------------------- 1 | # time cost = 668 µs ± 3.63 µs 2 | 3 | from collections import Counter 4 | 5 | def main(): 6 | with open('data/ep59.txt') as f: 7 | cipher = list(map(int,f.read().split(','))) 8 | space_ascii = ord(' ') 9 | key = [Counter(cipher[i::3]).most_common(1)[0][0] ^ space_ascii for i in range(3)] 10 | cycles = len(cipher)//3 11 | res = sum([x^y for x,y in zip(cipher,key*cycles)]) 12 | return res 13 | -------------------------------------------------------------------------------- /088.py: -------------------------------------------------------------------------------- 1 | # time cost = 163 ms ± 1.13 ms 2 | 3 | def main(): 4 | 5 | def update_min_n_arr(p,s,f,start): 6 | k = p - s + f 7 | if k < 12001: 8 | min_n_arr[k] = min(min_n_arr[k],p) 9 | for i in range(start,12000//p*2): 10 | update_min_n_arr(p*i,s+i,f+1,i) 11 | 12 | min_n_arr = [24000]*12001 13 | update_min_n_arr(1,1,1,2) 14 | return sum(set(min_n_arr[2:])) 15 | -------------------------------------------------------------------------------- /070.py: -------------------------------------------------------------------------------- 1 | # time cost = 47.4 ms ± 847 µs 2 | 3 | from sympy import primerange 4 | 5 | def main(): 6 | is_permutation = lambda x,y : "".join(sorted(str(x))) == "".join(sorted(str(y))) 7 | primes = list(primerange(2000,4000)) 8 | dt = {(x*y,(x-1)*(y-1)):((x*y)/((x-1)*(y-1))) for x in primes for y in primes if x*y<10**7} 9 | for n,phi_n in sorted(dt,key=dt.get): 10 | if is_permutation(n,phi_n): 11 | return n 12 | -------------------------------------------------------------------------------- /008.py: -------------------------------------------------------------------------------- 1 | # time cost = 4.71 ms ± 3.86 µs 2 | 3 | from functools import reduce 4 | 5 | def main(): 6 | with open('euler/ep08.txt','r') as f: 7 | data = '' 8 | for line in f.readlines(): 9 | data = data + line.strip() 10 | res = [] 11 | for i in range(988): 12 | sub = [int(x) for x in data[i:i+13]] 13 | prod = reduce(lambda x,y:x*y, sub) 14 | res.append(prod) 15 | return max(res) 16 | -------------------------------------------------------------------------------- /587.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.92 ms ± 98.5 µs 2 | 3 | from math import sqrt,asin,pi 4 | 5 | def t(n): 6 | res = (n**2+n-sqrt(2)*n**1.5)/(n**2+1) 7 | return res 8 | 9 | def area(t,n): 10 | res = 1/(2*n) - asin(1-t)/2 + (1-t)*(1-1/n)/2 11 | return res 12 | 13 | def main(N=0.001): 14 | i = 100 15 | while True: 16 | if area(t(i),i)/(1-pi/4) < N: 17 | return i 18 | else: 19 | i = i + 1 20 | -------------------------------------------------------------------------------- /data/ep79.txt: -------------------------------------------------------------------------------- 1 | 319 2 | 680 3 | 180 4 | 690 5 | 129 6 | 620 7 | 762 8 | 689 9 | 762 10 | 318 11 | 368 12 | 710 13 | 720 14 | 710 15 | 629 16 | 168 17 | 160 18 | 689 19 | 716 20 | 731 21 | 736 22 | 729 23 | 316 24 | 729 25 | 729 26 | 710 27 | 769 28 | 290 29 | 719 30 | 680 31 | 318 32 | 389 33 | 162 34 | 289 35 | 162 36 | 718 37 | 729 38 | 319 39 | 790 40 | 680 41 | 890 42 | 362 43 | 319 44 | 760 45 | 316 46 | 729 47 | 380 48 | 319 49 | 728 50 | 716 51 | -------------------------------------------------------------------------------- /206.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.58 ms ± 17.4 µs 2 | 3 | def is_concealed_square(number): 4 | seq = ['1', '2', '3', '4', '5', '6', '7', '8', '9','0'] 5 | digits = [x for x in str(number)] 6 | if len(digits) == 19 and digits[0::2] == seq: 7 | return True 8 | return False 9 | 10 | def main(n=1389026620): 11 | while True: 12 | if is_concealed_square(n**2): 13 | return n 14 | else: 15 | n = n - 10 16 | -------------------------------------------------------------------------------- /115.py: -------------------------------------------------------------------------------- 1 | # time cost = 19.8 µs ± 80.8 ns 2 | 3 | from functools import lru_cache 4 | 5 | @lru_cache(maxsize=None) 6 | def f(n,m): 7 | if n < m: 8 | return 1 9 | elif n == m: 10 | return 2 11 | else: 12 | return 2*f(n-1,m)-f(n-2,m)+f(n-m-1,m) 13 | 14 | def main(N=10**6): 15 | n = 51 16 | while True: 17 | w = f(n,50) 18 | if w > N: 19 | return n 20 | else: 21 | n += 1 22 | -------------------------------------------------------------------------------- /012.py: -------------------------------------------------------------------------------- 1 | # time cost = 127 ms ± 1.09 ms 2 | 3 | from sympy import factorint 4 | 5 | def number_of_divisor(n): 6 | d = factorint(n) 7 | res = 1 8 | for i in d: 9 | res *= (d[i]+1) if i%2==1 else d[i] 10 | return res 11 | 12 | def main(): 13 | n = 7 14 | nd,nnd = number_of_divisor(n),number_of_divisor(n+1) 15 | while nd*nnd <= 500: 16 | n += 1 17 | nd,nnd = nnd,number_of_divisor(n+1) 18 | return n*(n+1)//2 19 | -------------------------------------------------------------------------------- /021.py: -------------------------------------------------------------------------------- 1 | # time cost = 206 ms ± 2.44 ms 2 | 3 | from sympy import factorint 4 | 5 | def sum_of_divisors(n): 6 | divs = factorint(n) 7 | res = 1 8 | for p in divs: 9 | res *= (p**(divs[p]+1)-1)//(p-1) 10 | return res-n 11 | 12 | def main(n=10000): 13 | arr = [] 14 | for i in range(2,n+1): 15 | a = sum_of_divisors(i) 16 | if a != i and sum_of_divisors(a) == i: 17 | arr.append(i) 18 | return sum(arr) 19 | -------------------------------------------------------------------------------- /042.py: -------------------------------------------------------------------------------- 1 | # time cost = 5.08 ms ± 8.23 µs 2 | 3 | from math import sqrt 4 | 5 | def alphabet(word): 6 | alpha = lambda s : ord(s) - ord('A') + 1 7 | res = sum([alpha(x) for x in word]) 8 | return res 9 | 10 | def main(): 11 | with open('euler/ep42.txt','r') as f: 12 | data = f.read().replace('"',"").split(',') 13 | word_value = [alphabet(x) for x in data] 14 | res = [x for x in word_value if sqrt(1+8*x)%2==1] 15 | return len(res) 16 | -------------------------------------------------------------------------------- /118.py: -------------------------------------------------------------------------------- 1 | # time cost = 10.4 s ± 291 ms 2 | 3 | from itertools import permutations,product 4 | from sympy import isprime 5 | from sympy.utilities.iterables import multiset_partitions 6 | 7 | def main(): 8 | cnt = 0 9 | for pt in multiset_partitions([str(x) for x in range(1,10)]): 10 | for perm in product(*(permutations(x) for x in pt)): 11 | if all(isprime(int("".join(x))) for x in perm): 12 | cnt += 1 13 | return cnt 14 | -------------------------------------------------------------------------------- /231.py: -------------------------------------------------------------------------------- 1 | # time cost = 29.6s 2 | 3 | from sympy import primerange 4 | 5 | def legendre(n, p): 6 | exponent = 0 7 | while n > 0: 8 | n //= p 9 | exponent += n 10 | return exponent 11 | 12 | def main(n=2000_0000, k=1500_0000): 13 | total_sum = 0 14 | 15 | for p in primerange(1,n): 16 | exponent = legendre(n, p) - legendre(k, p) - legendre(n - k, p) 17 | total_sum += exponent * p 18 | 19 | return total_sum 20 | -------------------------------------------------------------------------------- /137.py: -------------------------------------------------------------------------------- 1 | # time cost = 13.2 µs ± 128 ns 2 | 3 | def main(N=15): 4 | arr = [] 5 | x1,y1,x2,y2,x3,y3 = -1,1,1,1,4,2 6 | u,v = 9,4 7 | while True: 8 | x1,y1 = -u+5*v,-v+u 9 | x2,y2 = u+5*v,v+u 10 | x3,y3 = 4*u+10*v,4*v+2*u 11 | target = [(x-1)//5 for x in [x1,x2,x3] if (x-1)%5==0] 12 | arr += target 13 | if len(arr) == N: 14 | return arr[-1] 15 | else: 16 | u,v = 9*u+20*v,4*u+9*v 17 | -------------------------------------------------------------------------------- /014.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.26 s ± 105 ms 2 | 3 | def main(N=10**6): 4 | d = {} 5 | for x in range(2,N): 6 | i,n = x,0 7 | while x != 1: 8 | if x < i: 9 | n = n + d[x] 10 | break 11 | elif x % 2 == 0: 12 | x = x // 2 13 | n += 1 14 | else: 15 | x = (3*x+1) // 2 16 | n += 2 17 | d[i] = n 18 | return max(d,key=d.get) 19 | -------------------------------------------------------------------------------- /023.py: -------------------------------------------------------------------------------- 1 | # time cost = 798 ms ± 1.93 ms 2 | 3 | def sigma(n): 4 | res = 0 5 | for i in range(1,int(n**0.5)+1): 6 | if n % i == 0: 7 | res += (i + n//i) if i**2 != n else i 8 | return res-n 9 | 10 | def main(): 11 | limit = 28123 12 | res,abn = 0,set() 13 | for i in range(1,limit+1): 14 | if sigma(i)>i: 15 | abn.add(i) 16 | if not any((i-x in abn) for x in abn): 17 | res += i 18 | return res 19 | -------------------------------------------------------------------------------- /090.py: -------------------------------------------------------------------------------- 1 | # timec cost = 456 ms ± 2.91 ms 2 | 3 | from itertools import combinations 4 | 5 | def main(): 6 | counter = 0 7 | sq = {1,4,6,16,25,36,46,64,81} 8 | cube_number = list(range(9)) + [6] 9 | comb = list(combinations(cube_number,6)) 10 | for i in comb: 11 | for j in comb: 12 | numbers = {e for x in i for y in j for e in (10*x+y,10*y+x)} 13 | if sq <= numbers: 14 | counter += 1 15 | return counter//2 16 | -------------------------------------------------------------------------------- /112.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.79 s ± 10.9 ms 2 | 3 | from itertools import count 4 | 5 | def is_bouncy_number(n): 6 | sort = sorted(str(n)) 7 | lst = list(str(n)) 8 | if sort == lst or sort == lst[::-1]: 9 | return False 10 | else: 11 | return True 12 | 13 | def main(pert=0.99): 14 | n = 0 15 | for i in count(100,1): 16 | if is_bouncy_number(i): 17 | n = n + 1 18 | if n/i >= pert: 19 | return i 20 | -------------------------------------------------------------------------------- /243.py: -------------------------------------------------------------------------------- 1 | # time cost = 49.4 ms ± 395 µs 2 | 3 | from sympy import prime 4 | from fractions import Fraction as f 5 | from math import prod 6 | 7 | def main(a=15499,b=94744): 8 | fy = lambda n:prod([prime(i) for i in range(1,n+1)]) 9 | fx = lambda n:prod([prime(i)-1 for i in range(1,n+1)]) 10 | n = 1 11 | while True: 12 | if f(fy(n),fx(n)) > f(b,a): 13 | break 14 | n = n + 1 15 | k = int(a/(a*fy(n)-b*fx(n)))+1 16 | return k * fy(n) 17 | -------------------------------------------------------------------------------- /022.py: -------------------------------------------------------------------------------- 1 | # time cost = 246 ms ± 608 µs 2 | 3 | def alphabet(word): 4 | alpha = lambda s : ord(s) - ord('A') + 1 5 | res = sum([alpha(x) for x in word]) 6 | return res 7 | 8 | def main(): 9 | with open('data/ep22.txt','r') as f: 10 | names = f.read().replace('"',"").split(',') 11 | sorted_names = sorted(names) 12 | name_score = lambda word : alphabet(word) * (sorted_names.index(word)+1) 13 | ans = sum([name_score(word) for word in names]) 14 | return ans 15 | -------------------------------------------------------------------------------- /080.py: -------------------------------------------------------------------------------- 1 | # time cost = 42.1 ms ± 549 µs 2 | 3 | def jarvis_sqrt_sum(n,prec=100): 4 | a,b = 5*n,5 5 | while len(str(b)) <= prec+3: 6 | if a >= b: 7 | a,b = a-b,b+10 8 | else: 9 | a,b = a*100,(b-b%10)*10+b%10 10 | return sum([int(x) for x in str(b)[:prec]]) 11 | 12 | def main(): 13 | numbers = set(range(2,100))-{x**2 for x in range(2,10)} 14 | ans = 0 15 | for i in numbers: 16 | ans += jarvis_sqrt_sum(i) 17 | return ans 18 | -------------------------------------------------------------------------------- /087.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.77 s ± 5.66 ms 2 | 3 | from itertools import product 4 | from sympy import primerange 5 | 6 | def main(N=5*10**7): 7 | ans = set() 8 | square_limit = int(N**(1/2))+1 9 | cube_limit = int(N**(1/3))+1 10 | fourth_power_limit = int(N**(1/4))+1 11 | for i,j,k in product(primerange(1,square_limit),primerange(1,cube_limit),primerange(1,fourth_power_limit)): 12 | p = i**2 + j**3 + k**4 13 | ans.add(p) 14 | return len({x for x in ans if x 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /104.py: -------------------------------------------------------------------------------- 1 | # time cost = 456 ms ± 4.23 ms 2 | 3 | from math import log10 4 | 5 | def fib_top_digits(k): 6 | phi = (1+5**0.5)/2 7 | d = k*log10(phi) - 0.5*log10(5) 8 | res = int(pow(10,d-int(d)+8)) 9 | return res 10 | 11 | def main(N=10**9): 12 | is_pandigital = lambda n:set(str(n)) == set('123456789') 13 | a,b,k = 1,1,2 14 | while True: 15 | a,b = b,(a+b)%N 16 | k = k + 1 17 | if is_pandigital(b) and is_pandigital(fib_top_digits(k)): 18 | return k 19 | -------------------------------------------------------------------------------- /179.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.16 s ± 7.57 ms 2 | 3 | import numpy as np 4 | from numba import njit 5 | 6 | @njit 7 | def number_of_divisors(N): 8 | nod = np.array([0,1]+[2]*(N-1)) 9 | u = int(N**0.5) 10 | for i in range(2,u+1): 11 | nod[i*i] += 1 12 | for j in range(i+1,N//i+1): 13 | nod[i*j] += 2 14 | return nod 15 | 16 | def main(N=10**7): 17 | nod = number_of_divisors(N) 18 | diff = np.diff(nod) 19 | res = N - np.count_nonzero(diff) 20 | return res 21 | -------------------------------------------------------------------------------- /075.py: -------------------------------------------------------------------------------- 1 | # time cost = 720 ms ± 18.5 ms 2 | 3 | from math import gcd 4 | from collections import Counter 5 | 6 | def main(N=1500000): 7 | limit,arr = int((N//2)**0.5)+1,[] 8 | for m in range(2,limit): 9 | for n in range(1,m): 10 | if (m+n)%2 == 1 and gcd(m,n) == 1: 11 | p,k = 2*m*(m+n),1 12 | while k*p <= N: 13 | arr.append(k*p) 14 | k += 1 15 | c = Counter(arr) 16 | return len([x for x in c.values() if x==1]) 17 | -------------------------------------------------------------------------------- /079.py: -------------------------------------------------------------------------------- 1 | # time cost = 367 µs ± 2.94 µs 2 | 3 | import networkx as nx 4 | 5 | def get_data_from_file(file_name="data/ep79.txt"): 6 | data = set() 7 | with open(file_name) as f: 8 | for line in f.readlines(): 9 | data.add(line) 10 | return data 11 | 12 | def main(): 13 | data = get_data_from_file() 14 | G = nx.DiGraph() 15 | for i in data: 16 | G.add_edges_from([(i[0],i[1]),(i[1],i[2])]) 17 | ans = list(nx.all_topological_sorts(G))[0] 18 | return int(''.join(ans)) 19 | -------------------------------------------------------------------------------- /094.py: -------------------------------------------------------------------------------- 1 | # time cost = 25.1 µs ± 56.2 ns 2 | 3 | def main(U=10**9): 4 | x,y = 7,4 5 | p_sum = 0 6 | while True: 7 | a1,a2 = (2*x+1)/3,(2*x-1)/3 8 | s1,s2 = (a1+1)*y/2,(a2-1)*y/2 9 | p1,p2 = (3*a1+1),(3*a2-1) 10 | if (p1<=U) and (a1%1==0) and (s1%1==0): 11 | p_sum += p1 12 | if (p2<=U) and (a2%1==0) and (s2%1==0): 13 | p_sum += p2 14 | if (p1>U) and (p2>U): 15 | return p_sum 16 | else: 17 | x,y = 2*x+3*y,x+2*y 18 | -------------------------------------------------------------------------------- /027.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.34 s ± 48 ms 2 | 3 | from sympy import isprime 4 | 5 | def primes_number(a,b): 6 | f = lambda n,a,b : n**2 + a*n + b 7 | n = 0 8 | while True: 9 | if isprime(f(n,a,b)): 10 | n = n + 1 11 | else: 12 | return n 13 | 14 | def main(): 15 | res = {} 16 | for a in range(-999,1000,2): 17 | for b in [x for x in range(-1000,1001) if isprime(x)]: 18 | res[primes_number(a,b)] = (a,b) 19 | a,b = res[max(res)] 20 | return a*b 21 | -------------------------------------------------------------------------------- /072.py: -------------------------------------------------------------------------------- 1 | # time cost = 225 ns ± 0.296 ns 2 | 3 | from functools import lru_cache 4 | 5 | def number_theory_block(f,n,i=1): 6 | ans = 0 7 | while i <= n: 8 | j = n//(n//i) 9 | ans += (j-i+1)*f(n//i) 10 | i = j + 1 11 | return ans 12 | 13 | @lru_cache(maxsize=2048) 14 | def sum_of_euler_phi(n): 15 | if n == 1: 16 | return 1 17 | else: 18 | return n*(n+1)//2 - number_theory_block(sum_of_euler_phi,n,2) 19 | 20 | def main(N=10**6): 21 | return sum_of_euler_phi(N)-1 22 | -------------------------------------------------------------------------------- /085.py: -------------------------------------------------------------------------------- 1 | # time cost = 194 µs ± 1.03 µs 2 | 3 | from itertools import count 4 | 5 | def main(N=2*10**6): 6 | for dist in count(1,1): 7 | c1,c2 = N-dist,N+dist 8 | limit = int(((8*c2**0.5+1)**0.5-1)/2) + 1 9 | for y in range(1,limit): 10 | t = y*(y+1) 11 | x1 = (-t+(t**2+16*c1*t)**0.5)/(2*t) 12 | x2 = (-t+(t**2+16*c2*t)**0.5)/(2*t) 13 | if x1.is_integer(): 14 | return x1 * y 15 | if x2.is_integer(): 16 | return x2 * y 17 | -------------------------------------------------------------------------------- /026.py: -------------------------------------------------------------------------------- 1 | # time cost = 11.7 ms ± 188 µs 2 | 3 | from math import gcd 4 | from sympy import isprime 5 | 6 | def repeat_num(n): 7 | rem = [1] 8 | while True: 9 | rem.append(10*rem[-1]%n) 10 | if rem[-1] == 0: 11 | return 0 12 | elif rem[-1] in rem[:-1]: 13 | return (len(rem)-1) 14 | 15 | def main(n=1000): 16 | for i in range(n,1,-1): 17 | if gcd(10,i) == 1 and isprime(i): 18 | rep_num = repeat_num(i) 19 | if rep_num == i-1: 20 | return i 21 | -------------------------------------------------------------------------------- /064.py: -------------------------------------------------------------------------------- 1 | # time cost = 285 ms ± 3.41 ms 2 | 3 | def square_root_period(n): 4 | a0 = int(n**0.5) 5 | if a0**2 == n: 6 | return 0 7 | else: 8 | a,m,d,arr = a0,0,1,[a0] 9 | while arr[-1] != 2*a0: 10 | m = d*a - m 11 | d = (n - m**2)//d 12 | a = int((a0+m)/d) 13 | arr.append(a) 14 | return len(arr)-1 15 | 16 | def main(N=10000): 17 | c = 0 18 | for i in range(1,N+1): 19 | if square_root_period(i) % 2 == 1: 20 | c += 1 21 | return c 22 | -------------------------------------------------------------------------------- /510.py: -------------------------------------------------------------------------------- 1 | # time cost = 15.9 ms ± 254 µs 2 | 3 | from math import gcd 4 | 5 | def triplets(u,v): 6 | rc = (u*v)**2 7 | ra = ((u+v)*u)**2 8 | rb = ((u+v)*v)**2 9 | return rc,ra,rb 10 | 11 | def main(n=10**9): 12 | res = 0 13 | u = int(((1+4*n**0.5)**0.5-1)/2) 14 | for j in range(1,u+1): 15 | for i in range(1,j+1): 16 | k = 1 17 | if gcd(i,j) == 1: 18 | rc,ra,rb = triplets(i,j) 19 | k = n // rb 20 | res += k*(k+1)*(rc+ra+rb)//2 21 | return res 22 | -------------------------------------------------------------------------------- /036.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.5 ms ± 13 µs 2 | 3 | def make_palindrome(x): 4 | s = str(x) 5 | p1 = s + s[::-1] 6 | p2 = s + s[:-1][::-1] 7 | return int(p1),int(p2) 8 | 9 | def main(): 10 | is_palindrome = lambda x : x[-1]!=0 and x == x[::-1] 11 | res = 0 12 | for i in range(1,1000): 13 | p1,p2 = make_palindrome(i) 14 | p1_base2,p2_base2 = bin(p1)[2:],bin(p2)[2:] 15 | if is_palindrome(p1_base2): 16 | res = res + p1 17 | if is_palindrome(p2_base2): 18 | res = res + p2 19 | return res 20 | -------------------------------------------------------------------------------- /144.py: -------------------------------------------------------------------------------- 1 | # time cost = 420 µs ± 322 ns 2 | 3 | def next_point(x0,y0,x1,y1): 4 | i = (y1-y0)/(x1-x0) 5 | n = y1/(4*x1) 6 | r = (-i+2*n+i*n**2)/(1+2*i*n-n**2) 7 | m = y1-r*x1 8 | x_new = (-2*r*m)/(4+r**2)-x1 9 | y_new = r * x_new + m 10 | return x_new,y_new 11 | 12 | def main(): 13 | n = 1 14 | x0,y0,x1,y1 = 0,10.1,1.4,-9.6 15 | while True: 16 | x_new,y_new = next_point(x0,y0,x1,y1) 17 | if abs(x_new)<=0.01 and y_new>0: 18 | return n 19 | else: 20 | x0,y0,x1,y1 = x1,y1,x_new,y_new 21 | n += 1 22 | -------------------------------------------------------------------------------- /047.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.07 s ± 3.09 ms 2 | 3 | from sympy import primefactors,nextprime 4 | 5 | def first_int(arr): 6 | f = lambda x : len(primefactors(x)) 7 | for i in range(len(arr)-3): 8 | if f(arr[i])==4 and f(arr[i+1])==4 and f(arr[i+2])==4 and f(arr[i+3])==4: 9 | return arr[i] 10 | return False 11 | 12 | def main(): 13 | p = 211 14 | while True: 15 | nextp = nextprime(p) 16 | if (nextp - p) > 4: 17 | ans = first_int(range(p+1,nextp)) 18 | if ans != False: 19 | return ans 20 | p = nextp 21 | -------------------------------------------------------------------------------- /719.py: -------------------------------------------------------------------------------- 1 | from functools import lru_cache 2 | 3 | def ndigits(n): 4 | res = len(str(n)) 5 | return res 6 | 7 | @lru_cache(maxsize=2048) 8 | def f(n,s): 9 | if n <= s: 10 | return n == s 11 | else: 12 | for i in range(1,ndigits(n)): 13 | if f(n % (10**i),s-n//(10**i)): 14 | return True 15 | return False 16 | 17 | def main(N=10**12): 18 | res = 0 19 | for i in range(1,int(N**0.5)+1): 20 | if i%9 == 0 or i%9==1: 21 | sq = i**2 22 | if f(sq,i): 23 | res += sq 24 | return res 25 | -------------------------------------------------------------------------------- /078.py: -------------------------------------------------------------------------------- 1 | # time cost = 14.1 s ± 66.9 ms 2 | 3 | def partion_function(n): 4 | pn = [1,1] 5 | for i in range(2,n+1): 6 | k,acc = 1,0 7 | g1 = lambda k : i - k*(3*k-1)//2 8 | g2 = lambda k : i - k*(3*k+1)//2 9 | f = lambda x : pn[x] if x >= 0 else 0 10 | while g1(k) >= 0: 11 | acc += (-1)**(k+1)*(f(g1(k))+f(g2(k))) 12 | k += 1 13 | pn.append(acc) 14 | return pn 15 | 16 | def main(N=10**6): 17 | pn = partion_function(55400) 18 | for i in range(61,len(pn)): 19 | if pn[i] % N == 0: 20 | return i 21 | -------------------------------------------------------------------------------- /081.py: -------------------------------------------------------------------------------- 1 | # time cost = 8.01 ms 2 | 3 | from functools import lru_cache 4 | 5 | with open('data/ep81.txt') as f: 6 | table = [list(map(int,s.split(','))) for s in f.readlines()] 7 | 8 | @lru_cache(maxsize=2048) 9 | def min_path_sum(r,c): 10 | if r == 0 and c == 0: 11 | return table[0][0] 12 | elif r == 0 and c >= 1: 13 | return sum(table[r][:c+1]) 14 | elif c == 0 and r >= 1: 15 | return sum(x[0] for x in table[:r+1]) 16 | else: 17 | return table[r][c] + min(min_path_sum(r-1,c),min_path_sum(r,c-1)) 18 | 19 | def main(N=80): 20 | return min_path_sum(N-1,N-1) 21 | -------------------------------------------------------------------------------- /050.py: -------------------------------------------------------------------------------- 1 | # time cost = 6.7 ms ± 709 µs 2 | 3 | from sympy import isprime,primerange,nextprime 4 | 5 | def primesum_below_N(N): 6 | start = 2 7 | arr = [start] 8 | while True: 9 | nextp = nextprime(start) 10 | arr.append(nextp) 11 | if sum(arr)>=N: 12 | return arr[:-1] 13 | start = nextp 14 | 15 | def main(N=10**6): 16 | primes = primesum_below_N(N) 17 | length = len(primes) 18 | for d in range(length-1,0,-1): 19 | for start in range((length-d+1)): 20 | res = sum(primes[start:start+d]) 21 | if isprime(res): 22 | return res 23 | -------------------------------------------------------------------------------- /044.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.55 s ± 10.6 ms 2 | 3 | from math import sqrt 4 | 5 | def is_pantagon(x): 6 | if (sqrt(24*x+1)+1) % 6 == 0: 7 | return True 8 | return False 9 | 10 | def main(): 11 | pantagon = lambda n : n*(3*n-1)/2 12 | pt = [pantagon(n) for n in range(1,2000)] 13 | for i in range(1,2000): 14 | for j in range(0,i): 15 | s1,s2 = pt[i] + 2*pt[j], 2*pt[i] + pt[j] 16 | pk = pt[i] + pt[j] 17 | if is_pantagon(pk): 18 | if is_pantagon(s1): 19 | return pt[i] 20 | if is_pantagon(s2): 21 | return pt[j] 22 | -------------------------------------------------------------------------------- /083.py: -------------------------------------------------------------------------------- 1 | # time cost = 98.2 ms ± 580 µs 2 | 3 | import networkx as nx 4 | 5 | def main(): 6 | with open('data/pe083.txt') as f: 7 | matrix = [[int(x) for x in row.split(',')] for row in f.readlines()] 8 | G = nx.DiGraph() 9 | for i in range(n): 10 | for j in range(m): 11 | neighbors = [(i+x, j+y) for x, y in [(-1,0), (0,-1), (1,0), (0,1)] if 0 <= i+x < n and 0 <= j+y < m] 12 | for ix, jy in neighbors: 13 | G.add_edge((i, j), (ix, jy), weight = matrix[ix][jy]) 14 | path_length = nx.dijkstra_path_length(G, source=(0,0), target=(n-1,m-1)) 15 | return path_length + matrix[0][0] 16 | -------------------------------------------------------------------------------- /005.py: -------------------------------------------------------------------------------- 1 | # approach 1, time complexity = O(n^2) 2 | 3 | from math import gcd 4 | from functools import reduce 5 | 6 | def lcm(n): 7 | def lcm(a, b): 8 | return (a * b) // gcd(a, b) 9 | return reduce(lcm, range(1,n+1)) 10 | 11 | # approach 2, time complexity = O(nlog(n)) 12 | 13 | from sympy import primerange 14 | from math import sqrt,log,floor 15 | 16 | def main(n=20): 17 | primes = list(primerange(1,n)) 18 | i,ans = 0,1 19 | while primes[i] < sqrt(n): 20 | e = floor(log(n)/log(primes[i])) 21 | ans *= (primes[i])**e 22 | i += 1 23 | for p in primes[i:]: 24 | ans *= p 25 | return ans 26 | -------------------------------------------------------------------------------- /040.py: -------------------------------------------------------------------------------- 1 | # time cost = 36.2 µs ± 433 ns 2 | 3 | def get_k_pub(n): 4 | previous_bound = lambda k : 10**k*(k-1/9)+1/9 5 | k = 1 6 | while previous_bound(k)= 10: 14 | k,pub = get_k_pub(n) 15 | m = (n-pub) // k 16 | r = (n-pub) % k 17 | t = 10**(k-1) + m + 1 18 | dn = int(str(t)[r-1]) 19 | return dn 20 | 21 | def main(): 22 | n = [10**x for x in range(7)] 23 | ans = 1 24 | for i in n: 25 | ans *= get_digit(i) 26 | return ans 27 | -------------------------------------------------------------------------------- /082.py: -------------------------------------------------------------------------------- 1 | # time cost = 7.4 ms ± 81.7 µs 2 | 3 | def min_path_sum(matrix): 4 | n = len(matrix) 5 | cost = [matrix[i][0] for i in range(n)] 6 | for column in range(1,n): 7 | cost[0] += matrix[0][column] 8 | for row in range(1,n): 9 | cost[row] = min(cost[row], cost[row-1]) + matrix[row][column] 10 | for row in range(n-2, -1, -1): 11 | cost[row] = min(cost[row], cost[row+1] + matrix[row][column]) 12 | return min(cost) 13 | 14 | def main(): 15 | with open('data/pe082.txt') as f: 16 | matrix = [[int(x) for x in row.split(',')] for row in f.readlines()] 17 | return min_path_sum(matrix) 18 | -------------------------------------------------------------------------------- /107.py: -------------------------------------------------------------------------------- 1 | # time cost = 5.9 ms ± 75.7 µs 2 | 3 | import numpy as np 4 | import networkx as nx 5 | 6 | def convert_matrix_to_graph(): 7 | with open('data/pe107.txt') as f: 8 | network = [] 9 | for line in f.readlines(): 10 | line = line.replace('-','0').strip() 11 | network.append([int(x) for x in line.split(',')]) 12 | g = nx.from_numpy_array(np.array(network)) 13 | return g 14 | 15 | def main(): 16 | g = convert_matrix_to_graph() 17 | mst = nx.minimum_spanning_tree(g) 18 | g_weights = g.size(weight='weight') 19 | mst_weights = t.size(weight='weight') 20 | return g_weights-mst_weights 21 | -------------------------------------------------------------------------------- /116.py: -------------------------------------------------------------------------------- 1 | # approach 1, time cost = 583 ns ± 2.65 ns 2 | 3 | from functools import lru_cache 4 | 5 | @lru_cache(maxsize=None) 6 | def f(n,m): 7 | if n < m: 8 | return 1 9 | else: 10 | return f(n-m,m)+f(n-1,m) 11 | 12 | def main(n=50): 13 | return f(n,2)+f(n,3)+f(n,4)-3 14 | 15 | # approach 2, time cost = 426 µs ± 3.03 µs 16 | 17 | from scipy.special import comb 18 | 19 | def replaced_ways(n,m): 20 | w = 0 21 | for k in range(1,n//m+1): 22 | t = k + n - k*m 23 | w += comb(t,k) 24 | return w 25 | 26 | def main(n=50,length=[2,3,4]): 27 | ways = [replaced_ways(n,x) for x in length] 28 | return sum(ways) 29 | -------------------------------------------------------------------------------- /035.py: -------------------------------------------------------------------------------- 1 | # time cost = 119 ms ± 4.07 ms 2 | 3 | from sympy import sieve,isprime 4 | 5 | def rotate_set(num): 6 | s = str(num) 7 | res = {num} 8 | for i in range(len(s)): 9 | new = s[1:] + s[0] 10 | res.add(int(new)) 11 | s = new 12 | return res 13 | 14 | def main(): 15 | primes = set(sieve.primerange(100,1e6)) 16 | digitset = {'1','3','7','9'} 17 | res_set = {i for i in primes if set(str(i))<=digitset} 18 | for ele in res_set: 19 | x = rotate_set(ele) 20 | for i in x: 21 | if isprime(i) == False: 22 | res_set = res_set-x 23 | break 24 | return len(res_set)+13 25 | -------------------------------------------------------------------------------- /043.py: -------------------------------------------------------------------------------- 1 | # time cost = 5.29 s ± 7.2 ms 2 | 3 | from itertools import permutations 4 | 5 | def main(): 6 | res,ans = [],0 7 | for i in permutations(range(10),10): 8 | d_by_three = (i[2]+i[3]+i[4])%3==0 9 | d_by_seven = (10*i[4]+i[5]-i[6]*2)%7==0 10 | d_by_eleven = (i[5]-i[6]+i[7])%11==0 11 | d_by_thirteen = (100*i[6]+10*i[7]+i[8])%13==0 12 | d_by_seventeen = (100*i[7]+10*i[8]+i[9])%17==0 13 | cond = d_by_three and d_by_seven and d_by_eleven and d_by_thirteen and d_by_seventeen 14 | if i[0]!=0 and i[5]==5 and i[3]%2==0 and cond: 15 | ans += sum([x*10**y for x,y in zip(i,range(9,-1,-1))]) 16 | return ans 17 | -------------------------------------------------------------------------------- /808.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.85 s ± 86.9 ms 2 | 3 | import numpy as np 4 | 5 | def prime_sieve(n): 6 | sieve = np.ones(n//3+(n%6==2), dtype=bool) 7 | sieve[0] = False 8 | for i in range(int(n**0.5)//3+1): 9 | if sieve[i]: 10 | k=3*i+1|1 11 | sieve[((k*k)//3)::2*k] = False 12 | sieve[(k*k+4*k-2*k*(i&1))//3::2*k] = False 13 | return np.r_[2,3,((3*np.nonzero(sieve)[0]+1)|1)] 14 | 15 | def main(n=32000000): 16 | res = 0 17 | p_squares = set(p*p for p in prime_sieve(n)) 18 | for p in p_squares: 19 | rp = int(str(p)[::-1]) 20 | if p != rp and rp in p_squares: 21 | res += p 22 | return res 23 | -------------------------------------------------------------------------------- /077.py: -------------------------------------------------------------------------------- 1 | # time cost = 1 ms 2 | 3 | from sympy import primepi 4 | from functools import lru_cache 5 | 6 | primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79] 7 | 8 | @lru_cache(maxsize=2048) 9 | def ways(x,y): 10 | if x == 0: 11 | return 1 12 | elif x == 1: 13 | return 0 14 | elif y == 1: 15 | return 0 if x%2==1 else 1 16 | elif x < primes[y-1]: 17 | return ways(x,y-1) 18 | else: 19 | return ways(x,y-1) + ways(x-primes[y-1],y) 20 | 21 | def main(N=5000): 22 | i = 11 23 | while True: 24 | w = ways(i,primepi(i)) 25 | if w > N: 26 | return i 27 | else: 28 | i += 1 29 | -------------------------------------------------------------------------------- /031.py: -------------------------------------------------------------------------------- 1 | # top-down method, time cost = 88.6 ns ± 0.468 ns 2 | 3 | from functools import lru_cache 4 | 5 | @lru_cache(maxsize=128) 6 | def ways(x,y=8): 7 | coins = [1, 2, 5, 10, 20, 50, 100, 200] 8 | if x == 1 or y == 1: 9 | return 1 10 | elif x < coins[y-1]: 11 | return ways(x,y-1) 12 | else: 13 | return ways(x,y-1) + ways(x-coins[y-1],y) 14 | 15 | # bottom up method, time cost = 221 µs ± 686 ns 16 | 17 | def dp(target=200): 18 | coins = [1, 2, 5, 10, 20, 50, 100, 200] 19 | d = {i:1 for i in range(target+1)} 20 | for j in range(1,len(coins)): 21 | for i in range(coins[j],target+1): 22 | d[i] = d[i] + d[i-coins[j]] 23 | return d[target] 24 | -------------------------------------------------------------------------------- /051.py: -------------------------------------------------------------------------------- 1 | # time cost = 355 ms ± 1.51 ms 2 | 3 | from sympy import nextprime,isprime 4 | from collections import Counter 5 | 6 | def is_replacable_prime(n): 7 | s = str(n) 8 | count = Counter(s) 9 | num,d = count.most_common(1)[0] 10 | if d == 3 and num in set('012'): 11 | k = 1 12 | for j in range(int(num)+1,10): 13 | new = s.replace(num,str(j)) 14 | if isprime(int(new)): 15 | k += 1 16 | if k == 8: 17 | return True 18 | return False 19 | 20 | def main(): 21 | n = 1111 22 | while True: 23 | p = nextprime(n) 24 | if is_replacable_prime(p): 25 | return p 26 | else: 27 | n = p 28 | -------------------------------------------------------------------------------- /018.py: -------------------------------------------------------------------------------- 1 | with open('data/ep18.txt') as f: 2 | table = [list(map(int,s.split())) for s in f.readlines()] 3 | 4 | # approach 1: bottom-up method, time cost = 62.1 µs ± 5.71 µs 5 | 6 | def main(): 7 | for row in range(len(table)-1, 0, -1): 8 | for col in range(0, row): 9 | table[row-1][col] += max(table[row][col], table[row][col+1]) 10 | return table[0][0] 11 | 12 | # approach 2: top-down method, time cost = 131 ns ± 8.97 ns 13 | 14 | from functools import lru_cache 15 | 16 | @lru_cache(maxsize=128) 17 | def mps(r=0,c=0): 18 | if r == len(table)-2: 19 | return table[r][c] + max(table[r+1][c],table[r+1][c+1]) 20 | else: 21 | return table[r][c] + max(mps(r+1,c),mps(r+1,c+1)) 22 | -------------------------------------------------------------------------------- /102.py: -------------------------------------------------------------------------------- 1 | # time cost = 9.9 ms ± 310 µs 2 | 3 | def area_of_triangle(xa,ya,xb,yb,xc,yc): 4 | area = abs((xa-xc)*(yb-ya)-(xa-xb)*(yc-ya)) / 2 5 | return area 6 | 7 | def main(): 8 | counter = 0 9 | with open('ep102.txt') as f: 10 | coords = [x.strip().split(',') for x in f.readlines()] 11 | for coord in coords: 12 | xa,ya,xb,yb,xc,yc = [int(x) for x in coord] 13 | abc = area_of_triangle(xa,ya,xb,yb,xc,yc) 14 | aob = area_of_triangle(xa,ya,0,0,xb,yb) 15 | aoc = area_of_triangle(xa,ya,0,0,xc,yc) 16 | boc = area_of_triangle(xb,yb,0,0,xc,yc) 17 | if abc == aob + aoc + boc: 18 | counter += 1 19 | return counter 20 | -------------------------------------------------------------------------------- /108.py: -------------------------------------------------------------------------------- 1 | # time cost = 151 µs ± 2.16 µs 2 | 3 | from sympy import factorint 4 | from functools import reduce 5 | from operator import mul,add 6 | 7 | def prime_product(factors): 8 | primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47] 9 | powers = sorted(reduce(add,[[(k-1)//2]*v for k,v in factors.items()]),reverse=True) 10 | bases = primes[:len(powers)] 11 | res = reduce(mul,[b**p for b,p in zip(bases,powers)]) 12 | return res 13 | 14 | def main(N=1000): 15 | n = 2*N - 1 16 | primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47] 17 | while True: 18 | factors = factorint(n) 19 | if all(x in [3,5,7] for x in factors.keys()): 20 | return prime_product(factors) 21 | n += 2 22 | -------------------------------------------------------------------------------- /110.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.41 s ± 9.52 ms 2 | 3 | from sympy import factorint 4 | from functools import reduce 5 | from operator import mul,add 6 | 7 | def prime_product(factors): 8 | primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47] 9 | powers = sorted(reduce(add,[[(k-1)//2]*v for k,v in factors.items()]),reverse=True) 10 | bases = primes[:len(powers)] 11 | res = reduce(mul,[b**p for b,p in zip(bases,powers)]) 12 | return res 13 | 14 | def main(N=4*10**6): 15 | n = 2*N - 1 16 | primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47] 17 | while True: 18 | factors = factorint(n) 19 | if all(x in [3,5,7] for x in factors.keys()): 20 | return prime_product(factors) 21 | n += 2 22 | -------------------------------------------------------------------------------- /122.py: -------------------------------------------------------------------------------- 1 | # time cost = 15.1 µs ± 12.6 ns 2 | 3 | from sympy import isprime 4 | from functools import lru_cache 5 | 6 | def p(n): 7 | for i in range(1,int(n**0.5)+1): 8 | if n % i == 0 and isprime(i): 9 | return i 10 | 11 | def sigma(n): 12 | arr = [23,43,59,77,83,107,149,163,165,179] 13 | if n in arr: 14 | return 1 15 | else: 16 | return 0 17 | 18 | @lru_cache(maxsize=None) 19 | def m(k): 20 | if k == 1: 21 | return 0 22 | elif k == 2: 23 | return 1 24 | elif isprime(k): 25 | return m(k-1)+1-sigma(k) 26 | else: 27 | return min(m(k-1)+1,m(p(k))+m(k//p(k)))-sigma(k) 28 | 29 | def main(N=200): 30 | res = [m(k) for k in range(1,N+1)] 31 | return sum(res) 32 | -------------------------------------------------------------------------------- /066.py: -------------------------------------------------------------------------------- 1 | # time cost = 17.2 ms ± 50.2 µs 2 | 3 | def pell_equation(D): 4 | a0 = int(D**0.5) 5 | a1 = int(2*a0/(D-a0**2)) 6 | seq,P,Q = [a0,a1],[a0,a1*a0+1],[1,a1] 7 | m,d = a0,D-a0**2 8 | while seq[-1] != 2*a0: 9 | m = d*seq[-1]-m 10 | d = (D-m**2)//d 11 | seq.append(int((a0+m)/d)) 12 | P.append(seq[-1]*P[-1]+P[-2]) 13 | Q.append(seq[-1]*Q[-1]+Q[-2]) 14 | if (len(seq)-1) % 2 == 0: 15 | return (P[-2],Q[-2]) 16 | else: 17 | return (P[-2]**2+Q[-2]**2*D,2*P[-2]*Q[-2]) 18 | 19 | def main(N=1000): 20 | dt = {} 21 | for i in range(8,N+1): 22 | if int(i**0.5)**2 == i: 23 | continue 24 | else: 25 | dt[i] = pell_equation(i)[0] 26 | return max(dt,key=dt.get) 27 | -------------------------------------------------------------------------------- /357.py: -------------------------------------------------------------------------------- 1 | # time cost = 32.9 s ± 120 ms 2 | 3 | from sympy import isprime 4 | import numpy as np 5 | 6 | def prime_sieve(n): 7 | sieve = np.ones(n//3+(n%6==2), dtype=np.bool) 8 | sieve[0] = False 9 | for i in range(int(n**0.5)//3+1): 10 | if sieve[i]: 11 | k=3*i+1|1 12 | sieve[((k*k)//3)::2*k] = False 13 | sieve[(k*k+4*k-2*k*(i&1))//3::2*k] = False 14 | return np.r_[2,3,((3*np.nonzero(sieve)[0]+1)|1)] 15 | 16 | def is_valid(n): 17 | u = int(n**0.5) + 1 18 | for i in range(2,u): 19 | if n % i == 0: 20 | if not isprime(i+n//i): 21 | return False 22 | return True 23 | 24 | def main(N=10**8): 25 | arr = prime_sieve(N) - 1 26 | return arr[np.vectorize(is_valid)(arr)].sum() 27 | -------------------------------------------------------------------------------- /143.py: -------------------------------------------------------------------------------- 1 | # time cost = 253 ms ± 5.44 ms 2 | 3 | from math import gcd 4 | from collections import defaultdict 5 | 6 | def generate_pairs(N=120000): 7 | pairs = defaultdict(set) 8 | for i in range(2,346): 9 | for j in range(1,i): 10 | if gcd(i,j) == 1 and (i-j)%3 != 0: 11 | q,r = 2*i*j+j**2,i**2-j**2 12 | q,r = max(q,r),min(q,r) 13 | for k in range(1,N//q+1): 14 | pairs[k*q].add(k*r) 15 | return pairs 16 | 17 | def main(N=120000): 18 | res = set() 19 | pairs = generate_pairs() 20 | for k,v in pairs.items(): 21 | for q in v: 22 | if q in pairs: 23 | for r in (v & pairs[q]): 24 | res.add(k+q+r) 25 | return sum({x for x in res if x<=N}) 26 | -------------------------------------------------------------------------------- /095.py: -------------------------------------------------------------------------------- 1 | # time cost = 16.2 s ± 343 ms 2 | 3 | import numpy as np 4 | 5 | def div_sum_dict(N=10**6): 6 | arr = np.zeros(N,dtype=int) 7 | k = 1 8 | for i in range(N//2): 9 | arr[i+k::k] += k 10 | k += 1 11 | res = {i+1:arr[i] for i in range(N)} 12 | return res 13 | 14 | divsum = div_sum_dict() 15 | 16 | def amicable_chain(start): 17 | arr = [start] 18 | while True: 19 | n = divsum.get(start) 20 | if n == arr[0]: 21 | return arr 22 | elif n == 1 or n > 10**6 or n in arr: 23 | return None 24 | else: 25 | arr.append(n) 26 | start = n 27 | 28 | def main(): 29 | res = [amicable_chain(i) for i in range(10000,10**6)] 30 | return min(max([x for x in res if x!=None],key=len)) 31 | -------------------------------------------------------------------------------- /140.py: -------------------------------------------------------------------------------- 1 | # time cost = 8.72 ms ± 64.4 µs 2 | 3 | import numpy as np 4 | from sympy.solvers.diophantine.diophantine import diop_DN 5 | 6 | def pelleq_solution_generator(d,n): 7 | u,v = diop_DN(d,1)[0] 8 | uv_zero = np.mat([[u],[v]]) 9 | uv_mat = np.mat([[u,d*v],[v,u]]) 10 | xy_mat = [np.mat([[x,d*y],[y,x]]) for x,y in diop_DN(d,n)] 11 | new_mat = np.identity(2,dtype=int) 12 | while True: 13 | yield [np.abs(x @ new_mat @ uv_zero) for x in xy_mat] 14 | new_mat = new_mat @ uv_mat 15 | 16 | def main(N=30): 17 | arr = [2] 18 | for sol in pelleq_solution_generator(5,44): 19 | for ans in sol: 20 | if ans[0,0] % 5 == 2: 21 | arr.append((ans[0,0]-7)//5) 22 | if len(arr) == N: 23 | return sum(arr) 24 | -------------------------------------------------------------------------------- /121.py: -------------------------------------------------------------------------------- 1 | # approach 1, time cost = 490 µs ± 8.63 µs 2 | 3 | import sympy as sp 4 | from math import prod,factorial 5 | 6 | def main(n=15): 7 | x = sp.var('x') 8 | expr = prod([(x+i) for i in range(1,n+1)]) 9 | p = sp.Poly(expr) 10 | res = factorial(n+1)//sum(p.coeffs()[:n//2+1]) 11 | return res 12 | 13 | # approach 2, time cost = 1.01ms 14 | 15 | from fractions import Fraction as f 16 | from functools import lru_cache 17 | from math import factorial 18 | 19 | @lru_cache(maxsize=None) 20 | def prob(n,k): 21 | if k == 0: 22 | return f(1,n+1) 23 | elif n == k: 24 | return f(1,factorial(n+1)) 25 | else: 26 | return prob(n-1,k)*f(n,n+1)+prob(n-1,k-1)*f(1,n+1) 27 | 28 | def main(n=15): 29 | p = sum([prob(n,i) for i in range(n//2+1,n)]) 30 | return 1//p 31 | -------------------------------------------------------------------------------- /060.py: -------------------------------------------------------------------------------- 1 | # time cost = 2.82 s ± 83.9 ms 2 | 3 | from sympy import isprime,primerange 4 | import networkx as nx 5 | from networkx.algorithms.clique import find_cliques 6 | 7 | def is_pair_prime(x,y): 8 | conc = lambda x,y:isprime(int(str(x)+str(y))) 9 | if x == 3: 10 | return conc(x,y) and conc(y,x) 11 | else: 12 | r = x % 3 13 | return y%3==r and conc(x,y) and conc(y,x) 14 | 15 | def main(N=8400): 16 | res = [] 17 | primes = list(primerange(3,N)) 18 | index = 0 19 | for p in primes: 20 | index += 1 21 | for i in primes[index:]: 22 | if is_pair_prime(p,i): 23 | res.append((p,i)) 24 | G = nx.Graph() 25 | G.add_edges_from(res) 26 | ans = [clique for clique in find_cliques(G) if len(clique)==5] 27 | return min(map(sum,ans)) 28 | -------------------------------------------------------------------------------- /074.py: -------------------------------------------------------------------------------- 1 | # time cost = 487 ms ± 2.44 ms 2 | 3 | DT = {169:3,363601:3,1454:3,871:2,45361:2,872:2,45362:2,69:5,78:4,540:2} 4 | 5 | def digit_fact_sum(x): 6 | fac = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880] 7 | res = sum([fac[int(i)] for i in str(x)]) 8 | return res 9 | 10 | def chain_length(n): 11 | arr,m = [],n 12 | global DT 13 | while True: 14 | if n in DT: 15 | length = len(arr) + DT[n] 16 | break 17 | elif n in arr: 18 | length = len(arr) 19 | break 20 | else: 21 | arr.append(n) 22 | n = digit_fact_sum(n) 23 | DT[m] = length 24 | return length 25 | 26 | def main(N=10**6): 27 | c = 0 28 | for i in range(1,N): 29 | if chain_length(i) == 60: 30 | c += 1 31 | return c 32 | -------------------------------------------------------------------------------- /103.py: -------------------------------------------------------------------------------- 1 | # time cost = 421 ms ± 88.1 ms 2 | 3 | from itertools import combinations 4 | 5 | def is_valid(B,tup): 6 | L,S = tup 7 | if len(B) == L: 8 | return sum(B) != S 9 | else: 10 | return (sum(B)-S)*(len(B)-L)>0 11 | 12 | def is_special_sumsets(s): 13 | arr = [(1,x) for x in sorted(s)] 14 | for r in range(2,len(s)): 15 | for i in combinations(sorted(s),r): 16 | for j in arr: 17 | if not is_valid(i,j): 18 | return False 19 | arr.append((len(i),sum(i))) 20 | return True 21 | 22 | def main(arr=[11,18,19,20,22,25],n=7): 23 | optimum = set(arr[len(arr)//2:] + sorted([x+y for x in arr for y in arr])) 24 | for i in combinations(optimum,n): 25 | if is_special_sumsets(i): 26 | return "".join([str(x) for x in i]) 27 | -------------------------------------------------------------------------------- /037.py: -------------------------------------------------------------------------------- 1 | # time cosst = 76.2 ms ± 249 µs 2 | 3 | from sympy import isprime,sieve 4 | 5 | def is_twoside_truncatable_prime(x): 6 | s = str(x) 7 | for i in range(1,len(s)): 8 | if not isprime(int(s[i:])) or not isprime(int(s[:i])): 9 | return False 10 | return True 11 | 12 | def main(): 13 | num,ans = 0,0 14 | for i in sieve.primerange(10,1e6): 15 | if i < 100 and is_twoside_truncatable_prime(i): 16 | num += 1 17 | ans += i 18 | elif i>=100: 19 | s = str(i) 20 | cond1 = (s[0]=='3' or '7') and (s[-1]=='3' or '7') 21 | cond2 = set(s)<={'1','3','7','9'} 22 | if cond1 and cond2 and is_twoside_truncatable_prime(i): 23 | num += 1 24 | ans += i 25 | if num>=11: 26 | return ans 27 | -------------------------------------------------------------------------------- /105.py: -------------------------------------------------------------------------------- 1 | # time cost = 13.7 s ± 736 ms 2 | 3 | from itertools import combinations 4 | 5 | def is_valid(B,tup): 6 | L,S = tup 7 | if len(B) == L: 8 | return sum(B) != S 9 | else: 10 | return (sum(B)-S)*(len(B)-L)>0 11 | 12 | def is_special_sumsets(s): 13 | arr = [(1,x) for x in sorted(s)] 14 | for r in range(2,len(s)): 15 | for i in combinations(sorted(s),r): 16 | for j in arr: 17 | if not is_valid(i,j): 18 | return False 19 | arr.append((len(i),sum(i))) 20 | return True 21 | 22 | def main(): 23 | res = 0 24 | with open('data/pe105.txt') as f: 25 | sets = [[int(x) for x in row.strip().split(',')] for row in f.readlines()] 26 | for s in sets: 27 | if is_special_sumsets(s): 28 | res += sum(s) 29 | return res 30 | -------------------------------------------------------------------------------- /017.py: -------------------------------------------------------------------------------- 1 | # time cost = 4.31 ms ± 58.6 µs 2 | 3 | import pandas as pd 4 | 5 | def num_to_words(n): 6 | if n in words_dict.keys(): 7 | return words_dict[n] 8 | else: 9 | if 21<=n<=100: 10 | ten_digit = n//10*10 11 | digit = n%10 12 | return words_dict[ten_digit] + words_dict[digit] 13 | elif 101<=n<=1000: 14 | hundred_dict = n//100 15 | remainder = n%100 16 | if remainder == 0: 17 | return words_dict[hundred_dict] + 'hundred' 18 | else: 19 | return words_dict[hundred_dict] + 'hundredand' + num_to_words(remainder) 20 | 21 | def main(): 22 | df = pd.read_csv('data/ep17.csv',header=None) 23 | words_dict = df.set_index(0).to_dict()[1] 24 | ans = sum([len(num_to_words(x)) for x in range(1,1001)]) 25 | return ans 26 | -------------------------------------------------------------------------------- /039.py: -------------------------------------------------------------------------------- 1 | # approach1, time cost = 60.1 ms ± 626 µs 2 | 3 | def number_of_solution(p): 4 | num = 0 5 | for a in range(1,p//3): 6 | if (p**2-2*p*a)%(2*p-2*a) == 0: 7 | num += 1 8 | return num 9 | 10 | def main(n=1000): 11 | d = {p:number_of_solution(p) for p in range(2,n+1,2)} 12 | ans = max(d,key=d.get) 13 | return ans 14 | 15 | # approach 2, time cost = 192 µs ± 844 ns 16 | 17 | from math import gcd 18 | from collections import Counter 19 | 20 | def max_number_of_solution(N=1000): 21 | limit,arr = int((N//2)**0.5)+1,[] 22 | for m in range(2,limit): 23 | for n in range(1,m): 24 | if (m+n)%2 == 1 and gcd(m,n) == 1: 25 | p,k = 2*m*(m+n),1 26 | while k*p <= N: 27 | arr.append(k*p) 28 | k += 1 29 | c = Counter(arr) 30 | return c.most_common()[0][0] 31 | -------------------------------------------------------------------------------- /073.py: -------------------------------------------------------------------------------- 1 | # approach 1, time cost = 2.97 s ± 6.42 ms 2 | 3 | def farey_seq(n=12000): 4 | b, d = 3, 11999 5 | ans = 0 6 | while d!=2: 7 | ans += 1 8 | k = int((n + b) / d) 9 | b, d = d, k * d - b 10 | return ans 11 | 12 | 13 | # approach 2, time cost = 101 ns ± 0.171 ns 14 | 15 | from functools import lru_cache 16 | 17 | def number_theory_block(f,n,i=1): 18 | ans = 0 19 | while i <= n: 20 | j = n//(n//i) 21 | ans += (j-i+1)*f(n//i) 22 | i = j + 1 23 | return ans 24 | 25 | def fractions_count(n): 26 | q,r = divmod(n,6) 27 | i = 1 if r == 5 else 0 28 | ans = q*(3*q-2+r)+i 29 | return ans 30 | 31 | @lru_cache(maxsize=2048) 32 | def reduced_fractions_count(n=12000): 33 | if n == 1: 34 | return 0 35 | else: 36 | return fractions_count(n) - number_theory_block(reduced_fractions_count,n,2) 37 | -------------------------------------------------------------------------------- /160.py: -------------------------------------------------------------------------------- 1 | # It has not been completely resolved and needs to be further modified 2 | 3 | from math import prod,log,gcd 4 | from functools import lru_cache 5 | from sympy.ntheory.modular import crt 6 | 7 | def v(n): 8 | u = int(log(n,5)) 9 | return sum([n//(5**i) for i in range(1,u+1)]) 10 | 11 | @lru_cache(maxsize=None) 12 | def A(n,m=3125): 13 | if n < m: 14 | return prod([x for x in range(1,n+1) if gcd(x,5)==1]) 15 | else: 16 | q,r = divmod(n,m) 17 | return ((-1)**q*A(r)) 18 | 19 | @lru_cache(maxsize=None) 20 | def F(n,m=3125): 21 | td = {1: 1, 2: 2, 3: 6, 4: 24, 5: 12, 6: 72, 7: 504, 8: 907, 9: 1913, 10: 1913} 22 | if n <= 10: 23 | return td[n] 24 | else: 25 | q,r = divmod(n,5) 26 | Q,R = divmod(n,m) 27 | return (((F(q))*(A(n)))//(pow(5,v(n)-q-v(q),m)*pow(2,v(n)-v(q),m)))%m 28 | 29 | def main(n=10**12): 30 | res = crt([3125,32],[F(n),0]) 31 | return res[0] 32 | -------------------------------------------------------------------------------- /727.py: -------------------------------------------------------------------------------- 1 | # time cost = 764 ms ± 12.5 ms 2 | 3 | 4 | from math import sqrt,gcd 5 | from itertools import combinations 6 | from functools import reduce 7 | 8 | 9 | def cods(a,b,r): 10 | x = ((a+b)**2+(r+a)**2-(r+b)**2)/(2*a+2*b) 11 | y = sqrt((a+r)**2-x**2) 12 | return x,y 13 | 14 | def inner_point(a,b,c): 15 | xa,ya = 0,0 16 | xb,yb = a+b,0 17 | xc,yc = cods(a,b,c) 18 | x = ((b+c)*xa+(a+c)*xb+(a+b)*xc)/(2*(a+b+c)) 19 | y = ((b+c)*ya+(a+c)*yb+(a+b)*yc)/(2*(a+b+c)) 20 | return x,y 21 | 22 | def soddy_circle_radius(a,b,c): 23 | return (a*b*c)/(a*b+a*c+b*c+2*sqrt(a*b*c*(a+b+c))) 24 | 25 | def dist(a,b,c): 26 | xd,yd = inner_point(a,b,c) 27 | xe,ye = cods(a,b,soddy_circle_radius(a,b,c)) 28 | return sqrt((xd-xe)**2+(yd-ye)**2) 29 | 30 | def ggcd(numbers): 31 | return reduce(gcd,numbers) 32 | 33 | def main(): 34 | res = [x for x in combinations(range(1,101),3) if ggcd(x)==1] 35 | return sum(dist(*x) for x in res)/len(res) 36 | -------------------------------------------------------------------------------- /540.py: -------------------------------------------------------------------------------- 1 | # time cost = 35min 37s 2 | 3 | from sympy import sieve,divisors 4 | 5 | def euler_phi_sieve(n): 6 | arr = list(range(n+1)) 7 | for i in range(2,n+1): 8 | if arr[i] == i: 9 | for j in range(i,n+1,i): 10 | arr[j] -= arr[j]//i 11 | return arr 12 | 13 | def phi(m,n,premob): 14 | res = 0 15 | for i in [x for x in divisors(m) if x<=n]: 16 | res += (premob[i-1]*(n//i)) 17 | return res 18 | 19 | def main(N=3141592653589793): 20 | res = 0 21 | u = int((N/2)**0.5)+1 22 | prephi = euler_phi_sieve(u) 23 | premob = list(sieve.mobiusrange(1,u)) 24 | for m in range(2,u): 25 | if m % 2 == 0: 26 | res += prephi[m] 27 | else: 28 | res += (prephi[m]//2) 29 | for m in range(u,int(N**0.5)+1): 30 | v = int((N-m**2)**0.5) 31 | if m % 2 == 0: 32 | res += phi(m,v,premob) 33 | else: 34 | res += phi(m,v//2,premob) 35 | return res 36 | -------------------------------------------------------------------------------- /092.py: -------------------------------------------------------------------------------- 1 | # time cost = 1.95 ms ± 12.1 µs 2 | 3 | from functools import lru_cache 4 | from math import log10 5 | 6 | def is_happy(n): 7 | 8 | cycle_members = {4, 16, 37, 58, 89, 145, 42, 20} 9 | 10 | def get_next(number): 11 | total_sum = 0 12 | while number > 0: 13 | number, digit = divmod(number, 10) 14 | total_sum += digit ** 2 15 | return total_sum 16 | 17 | while n != 1 and n not in cycle_members: 18 | n = get_next(n) 19 | 20 | return n == 1 21 | 22 | @lru_cache(maxsize=None) 23 | def f(n,k): 24 | if n == k == 0: 25 | return 1 26 | elif n < 0: 27 | return 0 28 | elif n > 0 and k ==0: 29 | return 0 30 | else: 31 | return sum([f(n-i**2,k-1) for i in range(10)]) 32 | 33 | def main(N=10**7): 34 | power = int(log10(N)) 35 | u = 9**2*power 36 | happy_numbers = [i for i in range(1,u+1) if is_happy(i)] 37 | ways = sum([f(x,power) for x in happy_numbers]) 38 | return (N - ways - 1) 39 | -------------------------------------------------------------------------------- /data/ep08.txt: -------------------------------------------------------------------------------- 1 | 73167176531330624919225119674426574742355349194934 2 | 96983520312774506326239578318016984801869478851843 3 | 85861560789112949495459501737958331952853208805511 4 | 12540698747158523863050715693290963295227443043557 5 | 66896648950445244523161731856403098711121722383113 6 | 62229893423380308135336276614282806444486645238749 7 | 30358907296290491560440772390713810515859307960866 8 | 70172427121883998797908792274921901699720888093776 9 | 65727333001053367881220235421809751254540594752243 10 | 52584907711670556013604839586446706324415722155397 11 | 53697817977846174064955149290862569321978468622482 12 | 83972241375657056057490261407972968652414535100474 13 | 82166370484403199890008895243450658541227588666881 14 | 16427171479924442928230863465674813919123162824586 15 | 17866458359124566529476545682848912883142607690042 16 | 24219022671055626321111109370544217506941658960408 17 | 07198403850962455444362981230987879927244284909188 18 | 84580156166097919133875499200524063689912560717606 19 | 05886116467109405077541002256983155200055935729725 20 | 71636269561882670428252483600823257530420752963450 21 | -------------------------------------------------------------------------------- /061.py: -------------------------------------------------------------------------------- 1 | # time cost = 92.1 ms ± 1.28 ms 2 | 3 | from collections import namedtuple 4 | 5 | def poly_numbers(s,n): 6 | Pn = namedtuple('Pn','s v ftd ltd') 7 | v = (n**2*(s-2)-n*(s-4))//2 8 | ftd,ltd = v // 100, v % 100 9 | pn = Pn(s,v,ftd,ltd) 10 | return pn 11 | 12 | def poly_number_graph(): 13 | arr,graph = [],{} 14 | for s in range(3,9): 15 | for n in range(19,141): 16 | pn = poly_numbers(s,n) 17 | if 999 < pn.v < 10000 and pn.ltd>9: 18 | arr.append(pn) 19 | for pn in arr: 20 | res = [] 21 | for apn in arr: 22 | if pn.s != apn.s and pn.ltd == apn.ftd: 23 | res.append(apn) 24 | graph[pn] = res 25 | return graph 26 | 27 | def dfs(graph,types,numbers): 28 | if len(types) == 6 and numbers[-1].ltd == numbers[0].ftd: 29 | print(sum([x.v for x in numbers])) 30 | else: 31 | for pn in graph.get(numbers[-1],[]): 32 | if pn.s not in types: 33 | dfs(graph,types+[pn.s],numbers+[pn]) 34 | 35 | def main(): 36 | graph = poly_number_graph() 37 | for pn in graph: 38 | dfs(graph,[pn.s],[pn]) 39 | -------------------------------------------------------------------------------- /098.py: -------------------------------------------------------------------------------- 1 | # time cost = 60.6 ms ± 372 µs 2 | 3 | def group_by_value(d): 4 | res = {} 5 | for k,v in d.items(): 6 | res[v] = [k] if v not in res.keys() else res[v] + [k] 7 | res = {k:v for k,v in res.items() if len(v)>1} 8 | return res 9 | 10 | def get_word_pairs(): 11 | with open('data/pe098.txt') as f: 12 | words = f.read().replace('"',"").split(',') 13 | d ={x:tuple(sorted(x)) for x in words} 14 | pairs = {k:v for k,v in group_by_value(d).items() if len(k)>2 and len(v)==2} 15 | return pairs 16 | 17 | def get_square_numbers(): 18 | is_all_diff = lambda n: len(set(str(n))) == len(str(n)) 19 | squares = [i**2 for i in range(10,31622) if is_all_diff(i**2)] 20 | sq_dict = {x:len(str(x)) for x in squares} 21 | return group_by_value(sq_dict) 22 | 23 | def main(): 24 | res = [] 25 | squares = get_square_numbers() 26 | pairs = get_word_pairs() 27 | for arr in pairs.values(): 28 | dt = len(arr[0]) 29 | for sq in squares[dt]: 30 | d = {k:v for k,v in zip(arr[0],str(sq))} 31 | num = int("".join([d[x] for x in arr[1]])) 32 | if num in squares[dt]: 33 | res += [sq,num] 34 | return max(res) 35 | -------------------------------------------------------------------------------- /011.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | with open('euler/ep11.txt','r') as f: 4 | data = [map(int, s.split()) for s in f.readlines()] 5 | 6 | def grid_largest_prod(data): 7 | import numpy as np 8 | length = len(data) 9 | res = np.zeros((length,length)) 10 | right = down = down_right = left_down = 0 11 | for i in range(length): 12 | for j in range(length): 13 | right_exist = all([x=0 for x in [i,i-1,i-2,i-3]]) 16 | if right_exist: 17 | right = data[i][j]*data[i+1][j]*data[i+2][j]*data[i+3][j] 18 | if down_exist: 19 | down = data[i][j]*data[i][j+1]*data[i][j+2]*data[i][j+3] 20 | if right_exist and down_exist: 21 | down_right = data[i][j]*data[i+1][j+2]*data[i+2][j+2]*data[i+3][j+3] 22 | if left_exist and down_exist: 23 | left_down = data[i][j]*data[i-1][j+1]*data[i-2][j+2]*data[i-3][j+3] 24 | res[i][j] = max(right,down,down_right,left_down) 25 | max_res = np.max(res) 26 | return max_res 27 | 28 | print grid_largest_prod(data) 29 | -------------------------------------------------------------------------------- /675.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | 3 | def smallest_prime_factor_sieve(n): 4 | arr = list(map(lambda x: x if x%2==1 else 2,range(n+1))) 5 | for i in range(3,int(n**0.5)+1,2): 6 | if arr[i] == i: 7 | for j in range(i*i,n+1,i): 8 | if arr[j] == j: 9 | arr[j] = i 10 | return arr 11 | 12 | def prime_factorization_sieve(n): 13 | spf = smallest_prime_factor_sieve(n) 14 | def get_factorization(x): 15 | res = dict() 16 | while x != 1: 17 | p = spf[x] 18 | exp = 1 19 | x = x // p 20 | while spf[x] == p: 21 | exp += 1 22 | x = x // p 23 | res.update({p:exp}) 24 | return res 25 | return [0,1]+[get_factorization(i) for i in range(2,n+1)] 26 | 27 | def sf(factors): 28 | res = 1 29 | for power in factors.values(): 30 | res *= (2*power+1) 31 | return res 32 | 33 | def main(N=10**7): 34 | M = 1000000087 35 | res,ct = 0,defaultdict(int) 36 | factors = prime_factorization_sieve(N) 37 | for i in range(1,N): 38 | for k,v in factors[i+1].items(): 39 | ct[k] += v 40 | res += (sf(ct) % M) 41 | return res%M 42 | -------------------------------------------------------------------------------- /093.py: -------------------------------------------------------------------------------- 1 | # time cost = 12.2 s ± 42 ms 2 | 3 | from itertools import permutations,product,count,combinations 4 | 5 | def eval_arith_expression(dp,op): 6 | arr = [] 7 | expr = (dp[0],op[0],dp[1],op[1],dp[2],op[2],dp[3]) 8 | s1 = "%d%s%d%s%d%s%d" % expr 9 | s2 = "(%d%s%d)%s(%d%s%d)" % expr 10 | s3 = "(%d%s(%d%s%d))%s%d" % expr 11 | s4 = "%d%s((%d%s%d)%s%d)" % expr 12 | s5 = "%d%s(%d%s(%d%s%d))" % expr 13 | for s in [s1,s2,s3,s4,s5]: 14 | try: 15 | arr.append(eval(s)) 16 | except ZeroDivisionError: 17 | pass 18 | return arr 19 | 20 | def consecutive_integers_number(integers): 21 | c = 0 22 | numbers = [] 23 | operators = list(product(["+","-","*","/"],repeat=3)) 24 | digits_perm = list(permutations(integers,4)) 25 | for dp in digits_perm: 26 | for op in operators: 27 | numbers += eval_arith_expression(dp,op) 28 | for i in count(1): 29 | if i in numbers: 30 | c += 1 31 | else: 32 | return c 33 | 34 | def main(): 35 | d = {} 36 | for p in combinations(range(1,10),4): 37 | d[tuple(p)] = consecutive_integers_number(p) 38 | res = max(d,key=d.get) 39 | return "".join([str(x) for x in res]) 40 | -------------------------------------------------------------------------------- /data/ep11.txt: -------------------------------------------------------------------------------- 1 | 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 2 | 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 3 | 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 4 | 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 5 | 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 6 | 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 7 | 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 8 | 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 9 | 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 10 | 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 11 | 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 12 | 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 13 | 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 14 | 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 15 | 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 16 | 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 17 | 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 18 | 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 19 | 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 20 | 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 -------------------------------------------------------------------------------- /205.py: -------------------------------------------------------------------------------- 1 | # approach 1, time cost = 101 ms ± 484 µs 2 | 3 | from itertools import product 4 | from collections import Counter 5 | 6 | def dice_values_sum_ways(sides,number): 7 | arrangement = product(range(1,sides+1),repeat=number) 8 | sum_of_values = [sum(x) for x in arrangement] 9 | c = Counter(sum_of_values) 10 | return dict(c) 11 | 12 | def main(): 13 | beats = 0 14 | total = (4**9) * (6**6) 15 | pw = dice_values_sum_ways(4,9) 16 | cw = dice_values_sum_ways(6,6) 17 | for k1,v1 in pw.items(): 18 | for k2,v2 in cw.items(): 19 | if k1 > k2: 20 | beats += (v1*v2) 21 | return round(beats/total,7) 22 | 23 | # appraoch 2, time cost = 3.88 ms ± 53.3 µs 24 | 25 | from scipy.special import comb 26 | 27 | def numbers_of_ways(m,n,p): 28 | up = int((p-m)/n)+1 29 | seq = [(-1)**j * comb(m,j) * comb(p-n*j-1,m-1) for j in range(up)] 30 | return sum(seq) 31 | 32 | def prob(): 33 | beats = 0 34 | total = (4**9) * (6**6) 35 | pw = {i:numbers_of_ways(9,4,i) for i in range(9,37)} 36 | cw = {i:numbers_of_ways(6,6,i) for i in range(6,37)} 37 | for k1,v1 in pw.items(): 38 | for k2,v2 in cw.items(): 39 | if k1 > k2: 40 | beats += (v1*v2) 41 | return round(beats/total,7) 42 | -------------------------------------------------------------------------------- /084.py: -------------------------------------------------------------------------------- 1 | # time cost = 3.52 ms ± 9.31 µs 2 | 3 | import numpy as np 4 | 5 | def get_dice_mat(): 6 | n,s = 40,4 7 | freq = {2:1,3:2,4:3,5:4,6:3,7:2,8:1} 8 | prob = {k:v/s**2 for k,v in freq.items()} 9 | mat = np.zeros((n,n)) 10 | for i in range(n): 11 | for j in range(n): 12 | mat[i,j] = prob.get((j-i)%40,0) 13 | return mat 14 | 15 | def get_card_mat(): 16 | n = 40 17 | card_mat = np.zeros((n,n)) 18 | for i in range(n): 19 | if i in [2,17,33]: 20 | card_mat[i,0] = 0.0625 21 | card_mat[i,i] = 0.875 22 | card_mat[i,10] = 0.0625 23 | elif i == 30: 24 | card_mat[i,10] = 1 25 | elif i == 7: 26 | card_mat[i,i] = 0.375 27 | card_mat[i,15] = 0.125 28 | for j in [0,4,5,10,11,12,24,39]: 29 | card_mat[i,j] = 0.0625 30 | elif i == 22: 31 | card_mat[i,i] = 0.375 32 | card_mat[i,25] = 0.125 33 | for j in [0,5,10,11,19,24,28,39]: 34 | card_mat[i,j] = 0.0625 35 | elif i == 36: 36 | card_mat[i,i] = 0.375 37 | card_mat[i,5] = 0.1875 38 | for j in [0,10,11,12,24,33,39]: 39 | card_mat[i,j] = 0.0625 40 | else: 41 | card_mat[i,i] = 1.0 42 | return card_mat 43 | 44 | def get_steady_vector(): 45 | C = get_card_mat() 46 | D = get_dice_mat() 47 | T = D @ C 48 | vec_i = np.array([1]+[0]*39) 49 | while True: 50 | vec_s = vec_i @ T 51 | if np.array_equal(vec_s,vec_i): 52 | return vec_s 53 | else: 54 | vec_i = vec_s 55 | 56 | def main(n=3): 57 | v = get_steady_vector() 58 | rank = (-v).argsort()[:n] 59 | return "".join([str(x) for x in rank]) 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > *Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics.* 2 | 3 | ## 欧拉计划是什么? 4 | 5 | 欧拉计划(Project Euler)是一个在线解题网站,或者通俗的说是一个是刷题网站,但是相比于力扣先程序员常用的刷题网站,欧拉计划中的题目数学味要更浓,通常需要结合一定的数学与编程知识,写出适当的程序来求解问题。 6 | 7 | 就我个人的经历,欧拉计划是一个锻炼个人算法技能与数学知识的绝佳工具,在解决问题的过程中,你不仅可以了解一些以前不甚了了的数学知识,更可以将这种数学知识与算法设计结合起来,从而得到不断优化的算法。 8 | 9 | 正因为网站上的很多题目需要你花大量的时间来查询文献、学习新的数学知识并编写代码来求解,解答出一道难题通常会给你带来更强烈的满足感,就像很多人常说的,欧拉计划会让人刷题上瘾。 10 | 11 | ## 欧拉计划适合什么人? 12 | 13 | 欧拉计划更加适合那些对数学感兴趣,尤其是对用编程来解决数学问题感兴趣的同学。就涉及的数学知识而言,欧拉计划中的大部分题目都与数论有关,所有了解一些常用的初等数论知识,如整除性质、数论函数、丢番图方程等等对解答题目会很有帮助。 14 | 15 | 欧拉计划不适合用来做准备程序员面试的刷题练习,因为欧拉计划中题目的难度通常比力扣等刷题网站中的题目要难得多,刷题非常浪费时间。其次,欧拉计划中的题目过于注重数学知识背景,而相对弱化了对编程技巧的训练,和一般公司的招聘要求是背道而驰的。 16 | 17 | 在编程语言方面,欧拉计划没有任何限制,解题时不需要提交代码,只需要提交最终结果就可以了,部分题目甚至可以使用数学技巧直接笔算解决。根据网站的提示,大部分问题应能在普通电脑上在一分钟内得到答案,如果代码的运行时间超过一分钟,则说明你的代码或者算法需要优化。 18 | 19 | ## 如何使用欧拉计划网站? 20 | 21 | 在进入欧拉计划网站后,我们可以点击上方的Archives栏查看所有题目,在下面的列表中一页会显示五十个题目,我们可以点击列表上方或下方的序号进行翻页,或者输入题号直接到达某个题目。 22 | 23 | 我们可以根据题目的序号(ID)、已解答的人数(Solved By)和难度系数(Difficulty)来对所有题目进行降序或升序排列。一般而言,我们可以根据已解答人数降序排列,这样可以更容易解决的题目会排在前面。其次我们可以根据难度系数选择题目,难度系数低的题目要比难度系数高的题目更易解决,但这个指标的可参考性不如已解答人数指标。 24 | 25 | 我们可以点击Progress栏查看我们的解题进度,包括已经解答出的题目、现在的等级、所获的奖章、发表的文章以及解题的时间线。当我们解答出题目后,可以点击对应这个问题的论坛,查看其它人是如何解决这个问题的。 26 | 27 | ## 为什么要建立欧拉计划中文站? 28 | 29 | 相对于力扣等刷题网站,欧拉计划的国内的知名度相对较低,一方面可能是因为定位比较小众,另一方面则是因为本土化不够,网站题目是英文,论坛上的讨论是英文,相关的参考文章也基本都是英文,对于英文不好的同学可能接受起来比较困难。 30 | 31 | 我建立[欧拉计划中文站](https://pe.metaquant.org/),一方面是经常觉得欧拉计划上的题目设计的非常巧妙,解题过程让我充满收获,值得翻译成中文和更多人分享;另一方面,也是对我自己的解题历程、思路和代码做一些记录并与大家交流,如能启发出更好的思路和代码,则更感欣慰。 32 | 33 | 在每篇文章中,我首先将题目翻译成了中文,然后给出了我的解题思路和对应的代码,代码也可以在本仓库中找到。如果对题目翻译、解题思路以及代码有疑惑或者需要指出其中的错误的,可以在仓库中发出issue,我会尽量积极回复。 34 | 35 | ## 我自己的解题历程 36 | 37 | 我在2017年7月20日做出了第一道题,这几年来在工作之余断断续续做出了接近一百多道题目,进度相对比较缓慢。我自身也不太注重刷题的速度,我希望能够对每道题给出最优的解法,不仅效率较高,同时代码结构也能比较优雅。在解题后,我会对解题思路做一个详细的描述,希望阅读的人能够很快的理解我的思路。关于我的解题进度,这幅图片会及时更新: 38 | 39 | ![img](https://projecteuler.net/profile/sorrowise.png) 40 | 41 | 我的主力编程语言是python,而这也是欧拉工程解题语言中最常用的语言之一。python由于其优秀的设计,以及诸如列表推导式,lambda表达式等可口的语法糖,众多易用的外部库,通常只需要很少数量的代码,就可以很优雅的解决一些复杂的问题。如果可能,将来我还会尝试用其它语言,比如说julia,Haskell来解答题目。 42 | -------------------------------------------------------------------------------- /054.py: -------------------------------------------------------------------------------- 1 | # time cost = 42.1 ms ± 157 µs 2 | 3 | from collections import Counter 4 | 5 | class Card: 6 | def __init__(self,vs): 7 | d = {'T':10,'J':11,'Q':12,'K':13,'A':14} 8 | self.s = vs[1] 9 | if vs[0] not in set('TJQKA'): 10 | self.v = int(vs[0]) 11 | else: 12 | self.v = d[vs[0]] 13 | 14 | class Hand: 15 | def __init__(self,cards): 16 | self.values = [x.v for x in cards] 17 | self.suits = [x.s for x in cards] 18 | self.value_counter = Counter(self.values).most_common() 19 | self.fc = self.value_counter[0][1] 20 | self.sc = self.value_counter[1][1] 21 | self.suit_kind = len(set(self.suits)) 22 | self.ranks = sorted([x.v for x in cards],reverse=True) 23 | self.diff = set([self.ranks[:-1][i]-self.ranks[1:][i] for i in range(4)]) 24 | 25 | def categories(self): 26 | if self.suit_kind == 1 and self.diff == {1}: 27 | return ('Straight Flush',9) 28 | elif self.suit_kind == 1: 29 | return ('Flush',6) 30 | elif self.diff == {1}: 31 | return ('Straight',5) 32 | elif self.fc == 4: 33 | return ('Four of a Kind',8) 34 | elif self.fc == 3 and self.sc == 2: 35 | return ('Full House',7) 36 | elif self.fc == 3 and self.sc == 1: 37 | return ('Three of a Kind',4) 38 | elif self.fc == 2 and self.sc == 2: 39 | return ('Two Pairs',3) 40 | elif len(self.value_counter) == 4 and self.fc == 2: 41 | return ('One Pair',2) 42 | else: 43 | return ('High Card',1) 44 | 45 | def is_winner(self,hand): 46 | if self.categories()[1] > hand.categories()[1]: 47 | return True 48 | elif self.categories()[1] < hand.categories()[1]: 49 | return False 50 | elif self.categories()[1] in [8,7,4,3,2]: 51 | return self.value_counter > hand.value_counter 52 | else: 53 | return self.ranks > hand.ranks 54 | 55 | def main(): 56 | count = 0 57 | with open('data/ep54.txt') as f: 58 | hands = [line.split() for line in f] 59 | for hand in hands: 60 | p1_cards = [Card(x) for x in hand[:5]] 61 | p2_cards = [Card(x) for x in hand[5:]] 62 | p1_hand,p2_hand = Hand(p1_cards),Hand(p2_cards) 63 | if p1_hand.is_winner(p2_hand): 64 | count += 1 65 | return count 66 | -------------------------------------------------------------------------------- /096.py: -------------------------------------------------------------------------------- 1 | # time cost = 221 ms ± 2.83 ms 2 | 3 | from itertools import product 4 | 5 | def exact_cover(X, Y): 6 | X = {j: set() for j in X} 7 | for i, row in Y.items(): 8 | for j in row: 9 | X[j].add(i) 10 | return X, Y 11 | 12 | def select(X, Y, r): 13 | cols = [] 14 | for j in Y[r]: 15 | for i in X[j]: 16 | for k in Y[i]: 17 | if k != j: 18 | X[k].remove(i) 19 | cols.append(X.pop(j)) 20 | return cols 21 | 22 | def deselect(X, Y, r, cols): 23 | for j in reversed(Y[r]): 24 | X[j] = cols.pop() 25 | for i in X[j]: 26 | for k in Y[i]: 27 | if k != j: 28 | X[k].add(i) 29 | 30 | def solve(X, Y, solution): 31 | if not X: 32 | yield list(solution) 33 | else: 34 | c = min(X, key=lambda c: len(X[c])) 35 | for r in list(X[c]): 36 | solution.append(r) 37 | cols = select(X, Y, r) 38 | for s in solve(X, Y, solution): 39 | yield s 40 | deselect(X, Y, r, cols) 41 | solution.pop() 42 | 43 | def solve_sudoku(size, grid): 44 | R, C = size 45 | N = R * C 46 | X = ([("rc", rc) for rc in product(range(N), range(N))] + 47 | [("rn", rn) for rn in product(range(N), range(1, N + 1))] + 48 | [("cn", cn) for cn in product(range(N), range(1, N + 1))] + 49 | [("bn", bn) for bn in product(range(N), range(1, N + 1))]) 50 | Y = dict() 51 | for r, c, n in product(range(N), range(N), range(1, N + 1)): 52 | b = (r // R) * R + (c // C) # Box number 53 | Y[(r, c, n)] = [ 54 | ("rc", (r, c)), 55 | ("rn", (r, n)), 56 | ("cn", (c, n)), 57 | ("bn", (b, n))] 58 | X, Y = exact_cover(X, Y) 59 | for i, row in enumerate(grid): 60 | for j, n in enumerate(row): 61 | if n: 62 | select(X, Y, (i, j, n)) 63 | for solution in solve(X, Y, []): 64 | for (r, c, n) in solution: 65 | grid[r][c] = n 66 | yield grid 67 | 68 | def import_grids(): 69 | grids = [] 70 | with open('data/pe096.txt') as f: 71 | data = f.readlines() 72 | for i in range(1,492,10): 73 | grid = [[int(x) for x in row.strip()] for row in data[i:i+9]] 74 | grids.append(grid) 75 | return grids 76 | 77 | def main(): 78 | ans = 0 79 | grids = import_grids() 80 | for grid in grids: 81 | g = list(solve_sudoku((3, 3), grid))[0] 82 | ans += (g[0][0]*100+g[0][1]*10+g[0][2]) 83 | return ans 84 | -------------------------------------------------------------------------------- /data/ep13.txt: -------------------------------------------------------------------------------- 1 | 37107287533902102798797998220837590246510135740250 2 | 46376937677490009712648124896970078050417018260538 3 | 74324986199524741059474233309513058123726617309629 4 | 91942213363574161572522430563301811072406154908250 5 | 23067588207539346171171980310421047513778063246676 6 | 89261670696623633820136378418383684178734361726757 7 | 28112879812849979408065481931592621691275889832738 8 | 44274228917432520321923589422876796487670272189318 9 | 47451445736001306439091167216856844588711603153276 10 | 70386486105843025439939619828917593665686757934951 11 | 62176457141856560629502157223196586755079324193331 12 | 64906352462741904929101432445813822663347944758178 13 | 92575867718337217661963751590579239728245598838407 14 | 58203565325359399008402633568948830189458628227828 15 | 80181199384826282014278194139940567587151170094390 16 | 35398664372827112653829987240784473053190104293586 17 | 86515506006295864861532075273371959191420517255829 18 | 71693888707715466499115593487603532921714970056938 19 | 54370070576826684624621495650076471787294438377604 20 | 53282654108756828443191190634694037855217779295145 21 | 36123272525000296071075082563815656710885258350721 22 | 45876576172410976447339110607218265236877223636045 23 | 17423706905851860660448207621209813287860733969412 24 | 81142660418086830619328460811191061556940512689692 25 | 51934325451728388641918047049293215058642563049483 26 | 62467221648435076201727918039944693004732956340691 27 | 15732444386908125794514089057706229429197107928209 28 | 55037687525678773091862540744969844508330393682126 29 | 18336384825330154686196124348767681297534375946515 30 | 80386287592878490201521685554828717201219257766954 31 | 78182833757993103614740356856449095527097864797581 32 | 16726320100436897842553539920931837441497806860984 33 | 48403098129077791799088218795327364475675590848030 34 | 87086987551392711854517078544161852424320693150332 35 | 59959406895756536782107074926966537676326235447210 36 | 69793950679652694742597709739166693763042633987085 37 | 41052684708299085211399427365734116182760315001271 38 | 65378607361501080857009149939512557028198746004375 39 | 35829035317434717326932123578154982629742552737307 40 | 94953759765105305946966067683156574377167401875275 41 | 88902802571733229619176668713819931811048770190271 42 | 25267680276078003013678680992525463401061632866526 43 | 36270218540497705585629946580636237993140746255962 44 | 24074486908231174977792365466257246923322810917141 45 | 91430288197103288597806669760892938638285025333403 46 | 34413065578016127815921815005561868836468420090470 47 | 23053081172816430487623791969842487255036638784583 48 | 11487696932154902810424020138335124462181441773470 49 | 63783299490636259666498587618221225225512486764533 50 | 67720186971698544312419572409913959008952310058822 51 | 95548255300263520781532296796249481641953868218774 52 | 76085327132285723110424803456124867697064507995236 53 | 37774242535411291684276865538926205024910326572967 54 | 23701913275725675285653248258265463092207058596522 55 | 29798860272258331913126375147341994889534765745501 56 | 18495701454879288984856827726077713721403798879715 57 | 38298203783031473527721580348144513491373226651381 58 | 34829543829199918180278916522431027392251122869539 59 | 40957953066405232632538044100059654939159879593635 60 | 29746152185502371307642255121183693803580388584903 61 | 41698116222072977186158236678424689157993532961922 62 | 62467957194401269043877107275048102390895523597457 63 | 23189706772547915061505504953922979530901129967519 64 | 86188088225875314529584099251203829009407770775672 65 | 11306739708304724483816533873502340845647058077308 66 | 82959174767140363198008187129011875491310547126581 67 | 97623331044818386269515456334926366572897563400500 68 | 42846280183517070527831839425882145521227251250327 69 | 55121603546981200581762165212827652751691296897789 70 | 32238195734329339946437501907836945765883352399886 71 | 75506164965184775180738168837861091527357929701337 72 | 62177842752192623401942399639168044983993173312731 73 | 32924185707147349566916674687634660915035914677504 74 | 99518671430235219628894890102423325116913619626622 75 | 73267460800591547471830798392868535206946944540724 76 | 76841822524674417161514036427982273348055556214818 77 | 97142617910342598647204516893989422179826088076852 78 | 87783646182799346313767754307809363333018982642090 79 | 10848802521674670883215120185883543223812876952786 80 | 71329612474782464538636993009049310363619763878039 81 | 62184073572399794223406235393808339651327408011116 82 | 66627891981488087797941876876144230030984490851411 83 | 60661826293682836764744779239180335110989069790714 84 | 85786944089552990653640447425576083659976645795096 85 | 66024396409905389607120198219976047599490197230297 86 | 64913982680032973156037120041377903785566085089252 87 | 16730939319872750275468906903707539413042652315011 88 | 94809377245048795150954100921645863754710598436791 89 | 78639167021187492431995700641917969777599028300699 90 | 15368713711936614952811305876380278410754449733078 91 | 40789923115535562561142322423255033685442488917353 92 | 44889911501440648020369068063960672322193204149535 93 | 41503128880339536053299340368006977710650566631954 94 | 81234880673210146739058568557934581403627822703280 95 | 82616570773948327592232845941706525094512325230608 96 | 22918802058777319719839450180888072429661980811197 97 | 77158542502016545090413245809786882778948721859617 98 | 72107838435069186155435662884062257473692284509516 99 | 20849603980134001723930671666823555245252804609722 100 | 53503534226472524250874054075591789781264330331690 -------------------------------------------------------------------------------- /data/pe096.txt: -------------------------------------------------------------------------------- 1 | Grid 01 2 | 003020600 3 | 900305001 4 | 001806400 5 | 008102900 6 | 700000008 7 | 006708200 8 | 002609500 9 | 800203009 10 | 005010300 11 | Grid 02 12 | 200080300 13 | 060070084 14 | 030500209 15 | 000105408 16 | 000000000 17 | 402706000 18 | 301007040 19 | 720040060 20 | 004010003 21 | Grid 03 22 | 000000907 23 | 000420180 24 | 000705026 25 | 100904000 26 | 050000040 27 | 000507009 28 | 920108000 29 | 034059000 30 | 507000000 31 | Grid 04 32 | 030050040 33 | 008010500 34 | 460000012 35 | 070502080 36 | 000603000 37 | 040109030 38 | 250000098 39 | 001020600 40 | 080060020 41 | Grid 05 42 | 020810740 43 | 700003100 44 | 090002805 45 | 009040087 46 | 400208003 47 | 160030200 48 | 302700060 49 | 005600008 50 | 076051090 51 | Grid 06 52 | 100920000 53 | 524010000 54 | 000000070 55 | 050008102 56 | 000000000 57 | 402700090 58 | 060000000 59 | 000030945 60 | 000071006 61 | Grid 07 62 | 043080250 63 | 600000000 64 | 000001094 65 | 900004070 66 | 000608000 67 | 010200003 68 | 820500000 69 | 000000005 70 | 034090710 71 | Grid 08 72 | 480006902 73 | 002008001 74 | 900370060 75 | 840010200 76 | 003704100 77 | 001060049 78 | 020085007 79 | 700900600 80 | 609200018 81 | Grid 09 82 | 000900002 83 | 050123400 84 | 030000160 85 | 908000000 86 | 070000090 87 | 000000205 88 | 091000050 89 | 007439020 90 | 400007000 91 | Grid 10 92 | 001900003 93 | 900700160 94 | 030005007 95 | 050000009 96 | 004302600 97 | 200000070 98 | 600100030 99 | 042007006 100 | 500006800 101 | Grid 11 102 | 000125400 103 | 008400000 104 | 420800000 105 | 030000095 106 | 060902010 107 | 510000060 108 | 000003049 109 | 000007200 110 | 001298000 111 | Grid 12 112 | 062340750 113 | 100005600 114 | 570000040 115 | 000094800 116 | 400000006 117 | 005830000 118 | 030000091 119 | 006400007 120 | 059083260 121 | Grid 13 122 | 300000000 123 | 005009000 124 | 200504000 125 | 020000700 126 | 160000058 127 | 704310600 128 | 000890100 129 | 000067080 130 | 000005437 131 | Grid 14 132 | 630000000 133 | 000500008 134 | 005674000 135 | 000020000 136 | 003401020 137 | 000000345 138 | 000007004 139 | 080300902 140 | 947100080 141 | Grid 15 142 | 000020040 143 | 008035000 144 | 000070602 145 | 031046970 146 | 200000000 147 | 000501203 148 | 049000730 149 | 000000010 150 | 800004000 151 | Grid 16 152 | 361025900 153 | 080960010 154 | 400000057 155 | 008000471 156 | 000603000 157 | 259000800 158 | 740000005 159 | 020018060 160 | 005470329 161 | Grid 17 162 | 050807020 163 | 600010090 164 | 702540006 165 | 070020301 166 | 504000908 167 | 103080070 168 | 900076205 169 | 060090003 170 | 080103040 171 | Grid 18 172 | 080005000 173 | 000003457 174 | 000070809 175 | 060400903 176 | 007010500 177 | 408007020 178 | 901020000 179 | 842300000 180 | 000100080 181 | Grid 19 182 | 003502900 183 | 000040000 184 | 106000305 185 | 900251008 186 | 070408030 187 | 800763001 188 | 308000104 189 | 000020000 190 | 005104800 191 | Grid 20 192 | 000000000 193 | 009805100 194 | 051907420 195 | 290401065 196 | 000000000 197 | 140508093 198 | 026709580 199 | 005103600 200 | 000000000 201 | Grid 21 202 | 020030090 203 | 000907000 204 | 900208005 205 | 004806500 206 | 607000208 207 | 003102900 208 | 800605007 209 | 000309000 210 | 030020050 211 | Grid 22 212 | 005000006 213 | 070009020 214 | 000500107 215 | 804150000 216 | 000803000 217 | 000092805 218 | 907006000 219 | 030400010 220 | 200000600 221 | Grid 23 222 | 040000050 223 | 001943600 224 | 009000300 225 | 600050002 226 | 103000506 227 | 800020007 228 | 005000200 229 | 002436700 230 | 030000040 231 | Grid 24 232 | 004000000 233 | 000030002 234 | 390700080 235 | 400009001 236 | 209801307 237 | 600200008 238 | 010008053 239 | 900040000 240 | 000000800 241 | Grid 25 242 | 360020089 243 | 000361000 244 | 000000000 245 | 803000602 246 | 400603007 247 | 607000108 248 | 000000000 249 | 000418000 250 | 970030014 251 | Grid 26 252 | 500400060 253 | 009000800 254 | 640020000 255 | 000001008 256 | 208000501 257 | 700500000 258 | 000090084 259 | 003000600 260 | 060003002 261 | Grid 27 262 | 007256400 263 | 400000005 264 | 010030060 265 | 000508000 266 | 008060200 267 | 000107000 268 | 030070090 269 | 200000004 270 | 006312700 271 | Grid 28 272 | 000000000 273 | 079050180 274 | 800000007 275 | 007306800 276 | 450708096 277 | 003502700 278 | 700000005 279 | 016030420 280 | 000000000 281 | Grid 29 282 | 030000080 283 | 009000500 284 | 007509200 285 | 700105008 286 | 020090030 287 | 900402001 288 | 004207100 289 | 002000800 290 | 070000090 291 | Grid 30 292 | 200170603 293 | 050000100 294 | 000006079 295 | 000040700 296 | 000801000 297 | 009050000 298 | 310400000 299 | 005000060 300 | 906037002 301 | Grid 31 302 | 000000080 303 | 800701040 304 | 040020030 305 | 374000900 306 | 000030000 307 | 005000321 308 | 010060050 309 | 050802006 310 | 080000000 311 | Grid 32 312 | 000000085 313 | 000210009 314 | 960080100 315 | 500800016 316 | 000000000 317 | 890006007 318 | 009070052 319 | 300054000 320 | 480000000 321 | Grid 33 322 | 608070502 323 | 050608070 324 | 002000300 325 | 500090006 326 | 040302050 327 | 800050003 328 | 005000200 329 | 010704090 330 | 409060701 331 | Grid 34 332 | 050010040 333 | 107000602 334 | 000905000 335 | 208030501 336 | 040070020 337 | 901080406 338 | 000401000 339 | 304000709 340 | 020060010 341 | Grid 35 342 | 053000790 343 | 009753400 344 | 100000002 345 | 090080010 346 | 000907000 347 | 080030070 348 | 500000003 349 | 007641200 350 | 061000940 351 | Grid 36 352 | 006080300 353 | 049070250 354 | 000405000 355 | 600317004 356 | 007000800 357 | 100826009 358 | 000702000 359 | 075040190 360 | 003090600 361 | Grid 37 362 | 005080700 363 | 700204005 364 | 320000084 365 | 060105040 366 | 008000500 367 | 070803010 368 | 450000091 369 | 600508007 370 | 003010600 371 | Grid 38 372 | 000900800 373 | 128006400 374 | 070800060 375 | 800430007 376 | 500000009 377 | 600079008 378 | 090004010 379 | 003600284 380 | 001007000 381 | Grid 39 382 | 000080000 383 | 270000054 384 | 095000810 385 | 009806400 386 | 020403060 387 | 006905100 388 | 017000620 389 | 460000038 390 | 000090000 391 | Grid 40 392 | 000602000 393 | 400050001 394 | 085010620 395 | 038206710 396 | 000000000 397 | 019407350 398 | 026040530 399 | 900020007 400 | 000809000 401 | Grid 41 402 | 000900002 403 | 050123400 404 | 030000160 405 | 908000000 406 | 070000090 407 | 000000205 408 | 091000050 409 | 007439020 410 | 400007000 411 | Grid 42 412 | 380000000 413 | 000400785 414 | 009020300 415 | 060090000 416 | 800302009 417 | 000040070 418 | 001070500 419 | 495006000 420 | 000000092 421 | Grid 43 422 | 000158000 423 | 002060800 424 | 030000040 425 | 027030510 426 | 000000000 427 | 046080790 428 | 050000080 429 | 004070100 430 | 000325000 431 | Grid 44 432 | 010500200 433 | 900001000 434 | 002008030 435 | 500030007 436 | 008000500 437 | 600080004 438 | 040100700 439 | 000700006 440 | 003004050 441 | Grid 45 442 | 080000040 443 | 000469000 444 | 400000007 445 | 005904600 446 | 070608030 447 | 008502100 448 | 900000005 449 | 000781000 450 | 060000010 451 | Grid 46 452 | 904200007 453 | 010000000 454 | 000706500 455 | 000800090 456 | 020904060 457 | 040002000 458 | 001607000 459 | 000000030 460 | 300005702 461 | Grid 47 462 | 000700800 463 | 006000031 464 | 040002000 465 | 024070000 466 | 010030080 467 | 000060290 468 | 000800070 469 | 860000500 470 | 002006000 471 | Grid 48 472 | 001007090 473 | 590080001 474 | 030000080 475 | 000005800 476 | 050060020 477 | 004100000 478 | 080000030 479 | 100020079 480 | 020700400 481 | Grid 49 482 | 000003017 483 | 015009008 484 | 060000000 485 | 100007000 486 | 009000200 487 | 000500004 488 | 000000020 489 | 500600340 490 | 340200000 491 | Grid 50 492 | 300200000 493 | 000107000 494 | 706030500 495 | 070009080 496 | 900020004 497 | 010800050 498 | 009040301 499 | 000702000 500 | 000008006 -------------------------------------------------------------------------------- /data/ep67.txt: -------------------------------------------------------------------------------- 1 | 59 2 | 73 41 3 | 52 40 09 4 | 26 53 06 34 5 | 10 51 87 86 81 6 | 61 95 66 57 25 68 7 | 90 81 80 38 92 67 73 8 | 30 28 51 76 81 18 75 44 9 | 84 14 95 87 62 81 17 78 58 10 | 21 46 71 58 02 79 62 39 31 09 11 | 56 34 35 53 78 31 81 18 90 93 15 12 | 78 53 04 21 84 93 32 13 97 11 37 51 13 | 45 03 81 79 05 18 78 86 13 30 63 99 95 14 | 39 87 96 28 03 38 42 17 82 87 58 07 22 57 15 | 06 17 51 17 07 93 09 07 75 97 95 78 87 08 53 16 | 67 66 59 60 88 99 94 65 55 77 55 34 27 53 78 28 17 | 76 40 41 04 87 16 09 42 75 69 23 97 30 60 10 79 87 18 | 12 10 44 26 21 36 32 84 98 60 13 12 36 16 63 31 91 35 19 | 70 39 06 05 55 27 38 48 28 22 34 35 62 62 15 14 94 89 86 20 | 66 56 68 84 96 21 34 34 34 81 62 40 65 54 62 05 98 03 02 60 21 | 38 89 46 37 99 54 34 53 36 14 70 26 02 90 45 13 31 61 83 73 47 22 | 36 10 63 96 60 49 41 05 37 42 14 58 84 93 96 17 09 43 05 43 06 59 23 | 66 57 87 57 61 28 37 51 84 73 79 15 39 95 88 87 43 39 11 86 77 74 18 24 | 54 42 05 79 30 49 99 73 46 37 50 02 45 09 54 52 27 95 27 65 19 45 26 45 25 | 71 39 17 78 76 29 52 90 18 99 78 19 35 62 71 19 23 65 93 85 49 33 75 09 02 26 | 33 24 47 61 60 55 32 88 57 55 91 54 46 57 07 77 98 52 80 99 24 25 46 78 79 05 27 | 92 09 13 55 10 67 26 78 76 82 63 49 51 31 24 68 05 57 07 54 69 21 67 43 17 63 12 28 | 24 59 06 08 98 74 66 26 61 60 13 03 09 09 24 30 71 08 88 70 72 70 29 90 11 82 41 34 29 | 66 82 67 04 36 60 92 77 91 85 62 49 59 61 30 90 29 94 26 41 89 04 53 22 83 41 09 74 90 30 | 48 28 26 37 28 52 77 26 51 32 18 98 79 36 62 13 17 08 19 54 89 29 73 68 42 14 08 16 70 37 31 | 37 60 69 70 72 71 09 59 13 60 38 13 57 36 09 30 43 89 30 39 15 02 44 73 05 73 26 63 56 86 12 32 | 55 55 85 50 62 99 84 77 28 85 03 21 27 22 19 26 82 69 54 04 13 07 85 14 01 15 70 59 89 95 10 19 33 | 04 09 31 92 91 38 92 86 98 75 21 05 64 42 62 84 36 20 73 42 21 23 22 51 51 79 25 45 85 53 03 43 22 34 | 75 63 02 49 14 12 89 14 60 78 92 16 44 82 38 30 72 11 46 52 90 27 08 65 78 03 85 41 57 79 39 52 33 48 35 | 78 27 56 56 39 13 19 43 86 72 58 95 39 07 04 34 21 98 39 15 39 84 89 69 84 46 37 57 59 35 59 50 26 15 93 36 | 42 89 36 27 78 91 24 11 17 41 05 94 07 69 51 96 03 96 47 90 90 45 91 20 50 56 10 32 36 49 04 53 85 92 25 65 37 | 52 09 61 30 61 97 66 21 96 92 98 90 06 34 96 60 32 69 68 33 75 84 18 31 71 50 84 63 03 03 19 11 28 42 75 45 45 38 | 61 31 61 68 96 34 49 39 05 71 76 59 62 67 06 47 96 99 34 21 32 47 52 07 71 60 42 72 94 56 82 83 84 40 94 87 82 46 39 | 01 20 60 14 17 38 26 78 66 81 45 95 18 51 98 81 48 16 53 88 37 52 69 95 72 93 22 34 98 20 54 27 73 61 56 63 60 34 63 40 | 93 42 94 83 47 61 27 51 79 79 45 01 44 73 31 70 83 42 88 25 53 51 30 15 65 94 80 44 61 84 12 77 02 62 02 65 94 42 14 94 41 | 32 73 09 67 68 29 74 98 10 19 85 48 38 31 85 67 53 93 93 77 47 67 39 72 94 53 18 43 77 40 78 32 29 59 24 06 02 83 50 60 66 42 | 32 01 44 30 16 51 15 81 98 15 10 62 86 79 50 62 45 60 70 38 31 85 65 61 64 06 69 84 14 22 56 43 09 48 66 69 83 91 60 40 36 61 43 | 92 48 22 99 15 95 64 43 01 16 94 02 99 19 17 69 11 58 97 56 89 31 77 45 67 96 12 73 08 20 36 47 81 44 50 64 68 85 40 81 85 52 09 44 | 91 35 92 45 32 84 62 15 19 64 21 66 06 01 52 80 62 59 12 25 88 28 91 50 40 16 22 99 92 79 87 51 21 77 74 77 07 42 38 42 74 83 02 05 45 | 46 19 77 66 24 18 05 32 02 84 31 99 92 58 96 72 91 36 62 99 55 29 53 42 12 37 26 58 89 50 66 19 82 75 12 48 24 87 91 85 02 07 03 76 86 46 | 99 98 84 93 07 17 33 61 92 20 66 60 24 66 40 30 67 05 37 29 24 96 03 27 70 62 13 04 45 47 59 88 43 20 66 15 46 92 30 04 71 66 78 70 53 99 47 | 67 60 38 06 88 04 17 72 10 99 71 07 42 25 54 05 26 64 91 50 45 71 06 30 67 48 69 82 08 56 80 67 18 46 66 63 01 20 08 80 47 07 91 16 03 79 87 48 | 18 54 78 49 80 48 77 40 68 23 60 88 58 80 33 57 11 69 55 53 64 02 94 49 60 92 16 35 81 21 82 96 25 24 96 18 02 05 49 03 50 77 06 32 84 27 18 38 49 | 68 01 50 04 03 21 42 94 53 24 89 05 92 26 52 36 68 11 85 01 04 42 02 45 15 06 50 04 53 73 25 74 81 88 98 21 67 84 79 97 99 20 95 04 40 46 02 58 87 50 | 94 10 02 78 88 52 21 03 88 60 06 53 49 71 20 91 12 65 07 49 21 22 11 41 58 99 36 16 09 48 17 24 52 36 23 15 72 16 84 56 02 99 43 76 81 71 29 39 49 17 51 | 64 39 59 84 86 16 17 66 03 09 43 06 64 18 63 29 68 06 23 07 87 14 26 35 17 12 98 41 53 64 78 18 98 27 28 84 80 67 75 62 10 11 76 90 54 10 05 54 41 39 66 52 | 43 83 18 37 32 31 52 29 95 47 08 76 35 11 04 53 35 43 34 10 52 57 12 36 20 39 40 55 78 44 07 31 38 26 08 15 56 88 86 01 52 62 10 24 32 05 60 65 53 28 57 99 53 | 03 50 03 52 07 73 49 92 66 80 01 46 08 67 25 36 73 93 07 42 25 53 13 96 76 83 87 90 54 89 78 22 78 91 73 51 69 09 79 94 83 53 09 40 69 62 10 79 49 47 03 81 30 54 | 71 54 73 33 51 76 59 54 79 37 56 45 84 17 62 21 98 69 41 95 65 24 39 37 62 03 24 48 54 64 46 82 71 78 33 67 09 16 96 68 52 74 79 68 32 21 13 78 96 60 09 69 20 36 55 | 73 26 21 44 46 38 17 83 65 98 07 23 52 46 61 97 33 13 60 31 70 15 36 77 31 58 56 93 75 68 21 36 69 53 90 75 25 82 39 50 65 94 29 30 11 33 11 13 96 02 56 47 07 49 02 56 | 76 46 73 30 10 20 60 70 14 56 34 26 37 39 48 24 55 76 84 91 39 86 95 61 50 14 53 93 64 67 37 31 10 84 42 70 48 20 10 72 60 61 84 79 69 65 99 73 89 25 85 48 92 56 97 16 57 | 03 14 80 27 22 30 44 27 67 75 79 32 51 54 81 29 65 14 19 04 13 82 04 91 43 40 12 52 29 99 07 76 60 25 01 07 61 71 37 92 40 47 99 66 57 01 43 44 22 40 53 53 09 69 26 81 07 58 | 49 80 56 90 93 87 47 13 75 28 87 23 72 79 32 18 27 20 28 10 37 59 21 18 70 04 79 96 03 31 45 71 81 06 14 18 17 05 31 50 92 79 23 47 09 39 47 91 43 54 69 47 42 95 62 46 32 85 59 | 37 18 62 85 87 28 64 05 77 51 47 26 30 65 05 70 65 75 59 80 42 52 25 20 44 10 92 17 71 95 52 14 77 13 24 55 11 65 26 91 01 30 63 15 49 48 41 17 67 47 03 68 20 90 98 32 04 40 68 60 | 90 51 58 60 06 55 23 68 05 19 76 94 82 36 96 43 38 90 87 28 33 83 05 17 70 83 96 93 06 04 78 47 80 06 23 84 75 23 87 72 99 14 50 98 92 38 90 64 61 58 76 94 36 66 87 80 51 35 61 38 61 | 57 95 64 06 53 36 82 51 40 33 47 14 07 98 78 65 39 58 53 06 50 53 04 69 40 68 36 69 75 78 75 60 03 32 39 24 74 47 26 90 13 40 44 71 90 76 51 24 36 50 25 45 70 80 61 80 61 43 90 64 11 62 | 18 29 86 56 68 42 79 10 42 44 30 12 96 18 23 18 52 59 02 99 67 46 60 86 43 38 55 17 44 93 42 21 55 14 47 34 55 16 49 24 23 29 96 51 55 10 46 53 27 92 27 46 63 57 30 65 43 27 21 20 24 83 63 | 81 72 93 19 69 52 48 01 13 83 92 69 20 48 69 59 20 62 05 42 28 89 90 99 32 72 84 17 08 87 36 03 60 31 36 36 81 26 97 36 48 54 56 56 27 16 91 08 23 11 87 99 33 47 02 14 44 73 70 99 43 35 33 64 | 90 56 61 86 56 12 70 59 63 32 01 15 81 47 71 76 95 32 65 80 54 70 34 51 40 45 33 04 64 55 78 68 88 47 31 47 68 87 03 84 23 44 89 72 35 08 31 76 63 26 90 85 96 67 65 91 19 14 17 86 04 71 32 95 65 | 37 13 04 22 64 37 37 28 56 62 86 33 07 37 10 44 52 82 52 06 19 52 57 75 90 26 91 24 06 21 14 67 76 30 46 14 35 89 89 41 03 64 56 97 87 63 22 34 03 79 17 45 11 53 25 56 96 61 23 18 63 31 37 37 47 66 | 77 23 26 70 72 76 77 04 28 64 71 69 14 85 96 54 95 48 06 62 99 83 86 77 97 75 71 66 30 19 57 90 33 01 60 61 14 12 90 99 32 77 56 41 18 14 87 49 10 14 90 64 18 50 21 74 14 16 88 05 45 73 82 47 74 44 67 | 22 97 41 13 34 31 54 61 56 94 03 24 59 27 98 77 04 09 37 40 12 26 87 09 71 70 07 18 64 57 80 21 12 71 83 94 60 39 73 79 73 19 97 32 64 29 41 07 48 84 85 67 12 74 95 20 24 52 41 67 56 61 29 93 35 72 69 68 | 72 23 63 66 01 11 07 30 52 56 95 16 65 26 83 90 50 74 60 18 16 48 43 77 37 11 99 98 30 94 91 26 62 73 45 12 87 73 47 27 01 88 66 99 21 41 95 80 02 53 23 32 61 48 32 43 43 83 14 66 95 91 19 81 80 67 25 88 69 | 08 62 32 18 92 14 83 71 37 96 11 83 39 99 05 16 23 27 10 67 02 25 44 11 55 31 46 64 41 56 44 74 26 81 51 31 45 85 87 09 81 95 22 28 76 69 46 48 64 87 67 76 27 89 31 11 74 16 62 03 60 94 42 47 09 34 94 93 72 70 | 56 18 90 18 42 17 42 32 14 86 06 53 33 95 99 35 29 15 44 20 49 59 25 54 34 59 84 21 23 54 35 90 78 16 93 13 37 88 54 19 86 67 68 55 66 84 65 42 98 37 87 56 33 28 58 38 28 38 66 27 52 21 81 15 08 22 97 32 85 27 71 | 91 53 40 28 13 34 91 25 01 63 50 37 22 49 71 58 32 28 30 18 68 94 23 83 63 62 94 76 80 41 90 22 82 52 29 12 18 56 10 08 35 14 37 57 23 65 67 40 72 39 93 39 70 89 40 34 07 46 94 22 20 05 53 64 56 30 05 56 61 88 27 72 | 23 95 11 12 37 69 68 24 66 10 87 70 43 50 75 07 62 41 83 58 95 93 89 79 45 39 02 22 05 22 95 43 62 11 68 29 17 40 26 44 25 71 87 16 70 85 19 25 59 94 90 41 41 80 61 70 55 60 84 33 95 76 42 63 15 09 03 40 38 12 03 32 73 | 09 84 56 80 61 55 85 97 16 94 82 94 98 57 84 30 84 48 93 90 71 05 95 90 73 17 30 98 40 64 65 89 07 79 09 19 56 36 42 30 23 69 73 72 07 05 27 61 24 31 43 48 71 84 21 28 26 65 65 59 65 74 77 20 10 81 61 84 95 08 52 23 70 74 | 47 81 28 09 98 51 67 64 35 51 59 36 92 82 77 65 80 24 72 53 22 07 27 10 21 28 30 22 48 82 80 48 56 20 14 43 18 25 50 95 90 31 77 08 09 48 44 80 90 22 93 45 82 17 13 96 25 26 08 73 34 99 06 49 24 06 83 51 40 14 15 10 25 01 75 | 54 25 10 81 30 64 24 74 75 80 36 75 82 60 22 69 72 91 45 67 03 62 79 54 89 74 44 83 64 96 66 73 44 30 74 50 37 05 09 97 70 01 60 46 37 91 39 75 75 18 58 52 72 78 51 81 86 52 08 97 01 46 43 66 98 62 81 18 70 93 73 08 32 46 34 76 | 96 80 82 07 59 71 92 53 19 20 88 66 03 26 26 10 24 27 50 82 94 73 63 08 51 33 22 45 19 13 58 33 90 15 22 50 36 13 55 06 35 47 82 52 33 61 36 27 28 46 98 14 73 20 73 32 16 26 80 53 47 66 76 38 94 45 02 01 22 52 47 96 64 58 52 39 77 | 88 46 23 39 74 63 81 64 20 90 33 33 76 55 58 26 10 46 42 26 74 74 12 83 32 43 09 02 73 55 86 54 85 34 28 23 29 79 91 62 47 41 82 87 99 22 48 90 20 05 96 75 95 04 43 28 81 39 81 01 28 42 78 25 39 77 90 57 58 98 17 36 73 22 63 74 51 78 | 29 39 74 94 95 78 64 24 38 86 63 87 93 06 70 92 22 16 80 64 29 52 20 27 23 50 14 13 87 15 72 96 81 22 08 49 72 30 70 24 79 31 16 64 59 21 89 34 96 91 48 76 43 53 88 01 57 80 23 81 90 79 58 01 80 87 17 99 86 90 72 63 32 69 14 28 88 69 79 | 37 17 71 95 56 93 71 35 43 45 04 98 92 94 84 96 11 30 31 27 31 60 92 03 48 05 98 91 86 94 35 90 90 08 48 19 33 28 68 37 59 26 65 96 50 68 22 07 09 49 34 31 77 49 43 06 75 17 81 87 61 79 52 26 27 72 29 50 07 98 86 01 17 10 46 64 24 18 56 80 | 51 30 25 94 88 85 79 91 40 33 63 84 49 67 98 92 15 26 75 19 82 05 18 78 65 93 61 48 91 43 59 41 70 51 22 15 92 81 67 91 46 98 11 11 65 31 66 10 98 65 83 21 05 56 05 98 73 67 46 74 69 34 08 30 05 52 07 98 32 95 30 94 65 50 24 63 28 81 99 57 81 | 19 23 61 36 09 89 71 98 65 17 30 29 89 26 79 74 94 11 44 48 97 54 81 55 39 66 69 45 28 47 13 86 15 76 74 70 84 32 36 33 79 20 78 14 41 47 89 28 81 05 99 66 81 86 38 26 06 25 13 60 54 55 23 53 27 05 89 25 23 11 13 54 59 54 56 34 16 24 53 44 06 82 | 13 40 57 72 21 15 60 08 04 19 11 98 34 45 09 97 86 71 03 15 56 19 15 44 97 31 90 04 87 87 76 08 12 30 24 62 84 28 12 85 82 53 99 52 13 94 06 65 97 86 09 50 94 68 69 74 30 67 87 94 63 07 78 27 80 36 69 41 06 92 32 78 37 82 30 05 18 87 99 72 19 99 83 | 44 20 55 77 69 91 27 31 28 81 80 27 02 07 97 23 95 98 12 25 75 29 47 71 07 47 78 39 41 59 27 76 13 15 66 61 68 35 69 86 16 53 67 63 99 85 41 56 08 28 33 40 94 76 90 85 31 70 24 65 84 65 99 82 19 25 54 37 21 46 33 02 52 99 51 33 26 04 87 02 08 18 96 84 | 54 42 61 45 91 06 64 79 80 82 32 16 83 63 42 49 19 78 65 97 40 42 14 61 49 34 04 18 25 98 59 30 82 72 26 88 54 36 21 75 03 88 99 53 46 51 55 78 22 94 34 40 68 87 84 25 30 76 25 08 92 84 42 61 40 38 09 99 40 23 29 39 46 55 10 90 35 84 56 70 63 23 91 39 85 | 52 92 03 71 89 07 09 37 68 66 58 20 44 92 51 56 13 71 79 99 26 37 02 06 16 67 36 52 58 16 79 73 56 60 59 27 44 77 94 82 20 50 98 33 09 87 94 37 40 83 64 83 58 85 17 76 53 02 83 52 22 27 39 20 48 92 45 21 09 42 24 23 12 37 52 28 50 78 79 20 86 62 73 20 59 86 | 54 96 80 15 91 90 99 70 10 09 58 90 93 50 81 99 54 38 36 10 30 11 35 84 16 45 82 18 11 97 36 43 96 79 97 65 40 48 23 19 17 31 64 52 65 65 37 32 65 76 99 79 34 65 79 27 55 33 03 01 33 27 61 28 66 08 04 70 49 46 48 83 01 45 19 96 13 81 14 21 31 79 93 85 50 05 87 | 92 92 48 84 59 98 31 53 23 27 15 22 79 95 24 76 05 79 16 93 97 89 38 89 42 83 02 88 94 95 82 21 01 97 48 39 31 78 09 65 50 56 97 61 01 07 65 27 21 23 14 15 80 97 44 78 49 35 33 45 81 74 34 05 31 57 09 38 94 07 69 54 69 32 65 68 46 68 78 90 24 28 49 51 45 86 35 88 | 41 63 89 76 87 31 86 09 46 14 87 82 22 29 47 16 13 10 70 72 82 95 48 64 58 43 13 75 42 69 21 12 67 13 64 85 58 23 98 09 37 76 05 22 31 12 66 50 29 99 86 72 45 25 10 28 19 06 90 43 29 31 67 79 46 25 74 14 97 35 76 37 65 46 23 82 06 22 30 76 93 66 94 17 96 13 20 72 89 | 63 40 78 08 52 09 90 41 70 28 36 14 46 44 85 96 24 52 58 15 87 37 05 98 99 39 13 61 76 38 44 99 83 74 90 22 53 80 56 98 30 51 63 39 44 30 91 91 04 22 27 73 17 35 53 18 35 45 54 56 27 78 48 13 69 36 44 38 71 25 30 56 15 22 73 43 32 69 59 25 93 83 45 11 34 94 44 39 92 90 | 12 36 56 88 13 96 16 12 55 54 11 47 19 78 17 17 68 81 77 51 42 55 99 85 66 27 81 79 93 42 65 61 69 74 14 01 18 56 12 01 58 37 91 22 42 66 83 25 19 04 96 41 25 45 18 69 96 88 36 93 10 12 98 32 44 83 83 04 72 91 04 27 73 07 34 37 71 60 59 31 01 54 54 44 96 93 83 36 04 45 91 | 30 18 22 20 42 96 65 79 17 41 55 69 94 81 29 80 91 31 85 25 47 26 43 49 02 99 34 67 99 76 16 14 15 93 08 32 99 44 61 77 67 50 43 55 87 55 53 72 17 46 62 25 50 99 73 05 93 48 17 31 70 80 59 09 44 59 45 13 74 66 58 94 87 73 16 14 85 38 74 99 64 23 79 28 71 42 20 37 82 31 23 92 | 51 96 39 65 46 71 56 13 29 68 53 86 45 33 51 49 12 91 21 21 76 85 02 17 98 15 46 12 60 21 88 30 92 83 44 59 42 50 27 88 46 86 94 73 45 54 23 24 14 10 94 21 20 34 23 51 04 83 99 75 90 63 60 16 22 33 83 70 11 32 10 50 29 30 83 46 11 05 31 17 86 42 49 01 44 63 28 60 07 78 95 40 93 | 44 61 89 59 04 49 51 27 69 71 46 76 44 04 09 34 56 39 15 06 94 91 75 90 65 27 56 23 74 06 23 33 36 69 14 39 05 34 35 57 33 22 76 46 56 10 61 65 98 09 16 69 04 62 65 18 99 76 49 18 72 66 73 83 82 40 76 31 89 91 27 88 17 35 41 35 32 51 32 67 52 68 74 85 80 57 07 11 62 66 47 22 67 94 | 65 37 19 97 26 17 16 24 24 17 50 37 64 82 24 36 32 11 68 34 69 31 32 89 79 93 96 68 49 90 14 23 04 04 67 99 81 74 70 74 36 96 68 09 64 39 88 35 54 89 96 58 66 27 88 97 32 14 06 35 78 20 71 06 85 66 57 02 58 91 72 05 29 56 73 48 86 52 09 93 22 57 79 42 12 01 31 68 17 59 63 76 07 77 95 | 73 81 14 13 17 20 11 09 01 83 08 85 91 70 84 63 62 77 37 07 47 01 59 95 39 69 39 21 99 09 87 02 97 16 92 36 74 71 90 66 33 73 73 75 52 91 11 12 26 53 05 26 26 48 61 50 90 65 01 87 42 47 74 35 22 73 24 26 56 70 52 05 48 41 31 18 83 27 21 39 80 85 26 08 44 02 71 07 63 22 05 52 19 08 20 96 | 17 25 21 11 72 93 33 49 64 23 53 82 03 13 91 65 85 02 40 05 42 31 77 42 05 36 06 54 04 58 07 76 87 83 25 57 66 12 74 33 85 37 74 32 20 69 03 97 91 68 82 44 19 14 89 28 85 85 80 53 34 87 58 98 88 78 48 65 98 40 11 57 10 67 70 81 60 79 74 72 97 59 79 47 30 20 54 80 89 91 14 05 33 36 79 39 97 | 60 85 59 39 60 07 57 76 77 92 06 35 15 72 23 41 45 52 95 18 64 79 86 53 56 31 69 11 91 31 84 50 44 82 22 81 41 40 30 42 30 91 48 94 74 76 64 58 74 25 96 57 14 19 03 99 28 83 15 75 99 01 89 85 79 50 03 95 32 67 44 08 07 41 62 64 29 20 14 76 26 55 48 71 69 66 19 72 44 25 14 01 48 74 12 98 07 98 | 64 66 84 24 18 16 27 48 20 14 47 69 30 86 48 40 23 16 61 21 51 50 26 47 35 33 91 28 78 64 43 68 04 79 51 08 19 60 52 95 06 68 46 86 35 97 27 58 04 65 30 58 99 12 12 75 91 39 50 31 42 64 70 04 46 07 98 73 98 93 37 89 77 91 64 71 64 65 66 21 78 62 81 74 42 20 83 70 73 95 78 45 92 27 34 53 71 15 99 | 30 11 85 31 34 71 13 48 05 14 44 03 19 67 23 73 19 57 06 90 94 72 57 69 81 62 59 68 88 57 55 69 49 13 07 87 97 80 89 05 71 05 05 26 38 40 16 62 45 99 18 38 98 24 21 26 62 74 69 04 85 57 77 35 58 67 91 79 79 57 86 28 66 34 72 51 76 78 36 95 63 90 08 78 47 63 45 31 22 70 52 48 79 94 15 77 61 67 68 100 | 23 33 44 81 80 92 93 75 94 88 23 61 39 76 22 03 28 94 32 06 49 65 41 34 18 23 08 47 62 60 03 63 33 13 80 52 31 54 73 43 70 26 16 69 57 87 83 31 03 93 70 81 47 95 77 44 29 68 39 51 56 59 63 07 25 70 07 77 43 53 64 03 94 42 95 39 18 01 66 21 16 97 20 50 90 16 70 10 95 69 29 06 25 61 41 26 15 59 63 35 101 | -------------------------------------------------------------------------------- /data/ep42.txt: -------------------------------------------------------------------------------- 1 | "A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH" -------------------------------------------------------------------------------- /data/ep89.txt: -------------------------------------------------------------------------------- 1 | MMMMDCLXXII 2 | MMDCCCLXXXIII 3 | MMMDLXVIIII 4 | MMMMDXCV 5 | DCCCLXXII 6 | MMCCCVI 7 | MMMCDLXXXVII 8 | MMMMCCXXI 9 | MMMCCXX 10 | MMMMDCCCLXXIII 11 | MMMCCXXXVII 12 | MMCCCLXXXXIX 13 | MDCCCXXIIII 14 | MMCXCVI 15 | CCXCVIII 16 | MMMCCCXXXII 17 | MDCCXXX 18 | MMMDCCCL 19 | MMMMCCLXXXVI 20 | MMDCCCXCVI 21 | MMMDCII 22 | MMMCCXII 23 | MMMMDCCCCI 24 | MMDCCCXCII 25 | MDCXX 26 | CMLXXXVII 27 | MMMXXI 28 | MMMMCCCXIV 29 | MLXXII 30 | MCCLXXVIIII 31 | MMMMCCXXXXI 32 | MMDCCCLXXII 33 | MMMMXXXI 34 | MMMDCCLXXX 35 | MMDCCCLXXIX 36 | MMMMLXXXV 37 | MCXXI 38 | MDCCCXXXVII 39 | MMCCCLXVII 40 | MCDXXXV 41 | CCXXXIII 42 | CMXX 43 | MMMCLXIV 44 | MCCCLXXXVI 45 | DCCCXCVIII 46 | MMMDCCCCXXXIV 47 | CDXVIIII 48 | MMCCXXXV 49 | MDCCCXXXII 50 | MMMMD 51 | MMDCCLXIX 52 | MMMMCCCLXXXXVI 53 | MMDCCXLII 54 | MMMDCCCVIIII 55 | DCCLXXXIIII 56 | MDCCCCXXXII 57 | MMCXXVII 58 | DCCCXXX 59 | CCLXIX 60 | MMMXI 61 | MMMMCMLXXXXVIII 62 | MMMMDLXXXVII 63 | MMMMDCCCLX 64 | MMCCLIV 65 | CMIX 66 | MMDCCCLXXXIIII 67 | CLXXXII 68 | MMCCCCXXXXV 69 | MMMMDLXXXVIIII 70 | MMMDCCCXXI 71 | MMDCCCCLXXVI 72 | MCCCCLXX 73 | MMCDLVIIII 74 | MMMDCCCLIX 75 | MMMMCCCCXIX 76 | MMMDCCCLXXV 77 | XXXI 78 | CDLXXXIII 79 | MMMCXV 80 | MMDCCLXIII 81 | MMDXXX 82 | MMMMCCCLVII 83 | MMMDCI 84 | MMMMCDLXXXIIII 85 | MMMMCCCXVI 86 | CCCLXXXVIII 87 | MMMMCML 88 | MMMMXXIV 89 | MMMCCCCXXX 90 | DCCX 91 | MMMCCLX 92 | MMDXXXIII 93 | CCCLXIII 94 | MMDCCXIII 95 | MMMCCCXLIV 96 | CLXXXXI 97 | CXVI 98 | MMMMCXXXIII 99 | CLXX 100 | DCCCXVIII 101 | MLXVII 102 | DLXXXX 103 | MMDXXI 104 | MMMMDLXXXXVIII 105 | MXXII 106 | LXI 107 | DCCCCXLIII 108 | MMMMDV 109 | MMMMXXXIV 110 | MDCCCLVIII 111 | MMMCCLXXII 112 | MMMMDCCXXXVI 113 | MMMMLXXXIX 114 | MDCCCLXXXI 115 | MMMMDCCCXV 116 | MMMMCCCCXI 117 | MMMMCCCLIII 118 | MDCCCLXXI 119 | MMCCCCXI 120 | MLXV 121 | MMCDLXII 122 | MMMMDXXXXII 123 | MMMMDCCCXL 124 | MMMMCMLVI 125 | CCLXXXIV 126 | MMMDCCLXXXVI 127 | MMCLII 128 | MMMCCCCXV 129 | MMLXXXIII 130 | MMMV 131 | MMMV 132 | DCCLXII 133 | MMDCCCCXVI 134 | MMDCXLVIII 135 | CCLIIII 136 | CCCXXV 137 | MMDCCLXXXVIIII 138 | MMMMDCLXXVIII 139 | MMMMDCCCXCI 140 | MMMMCCCXX 141 | MMCCXLV 142 | MMMDCCCLXIX 143 | MMCCLXIIII 144 | MMMDCCCXLIX 145 | MMMMCCCLXIX 146 | CMLXXXXI 147 | MCMLXXXIX 148 | MMCDLXI 149 | MMDCLXXVIII 150 | MMMMDCCLXI 151 | MCDXXV 152 | DL 153 | CCCLXXII 154 | MXVIIII 155 | MCCCCLXVIII 156 | CIII 157 | MMMDCCLXXIIII 158 | MMMDVIII 159 | MMMMCCCLXXXXVII 160 | MMDXXVII 161 | MMDCCLXXXXV 162 | MMMMCXLVI 163 | MMMDCCLXXXII 164 | MMMDXXXVI 165 | MCXXII 166 | CLI 167 | DCLXXXIX 168 | MMMCLI 169 | MDCLXIII 170 | MMMMDCCXCVII 171 | MMCCCLXXXV 172 | MMMDCXXVIII 173 | MMMCDLX 174 | MMMCMLII 175 | MMMIV 176 | MMMMDCCCLVIII 177 | MMMDLXXXVIII 178 | MCXXIV 179 | MMMMLXXVI 180 | CLXXIX 181 | MMMCCCCXXVIIII 182 | DCCLXXXV 183 | MMMDCCCVI 184 | LI 185 | CLXXXVI 186 | MMMMCCCLXXVI 187 | MCCCLXVI 188 | CCXXXIX 189 | MMDXXXXI 190 | MMDCCCXLI 191 | DCCCLXXXVIII 192 | MMMMDCCCIV 193 | MDCCCCXV 194 | MMCMVI 195 | MMMMCMLXXXXV 196 | MMDCCLVI 197 | MMMMCCXLVIII 198 | DCCCCIIII 199 | MMCCCCIII 200 | MMMDCCLXXXVIIII 201 | MDCCCLXXXXV 202 | DVII 203 | MMMV 204 | DCXXV 205 | MMDCCCXCV 206 | DCVIII 207 | MMCDLXVI 208 | MCXXVIII 209 | MDCCXCVIII 210 | MMDCLX 211 | MMMDCCLXIV 212 | MMCDLXXVII 213 | MMDLXXXIIII 214 | MMMMCCCXXII 215 | MMMDCCCXLIIII 216 | DCCCCLXVII 217 | MMMCLXXXXIII 218 | MCCXV 219 | MMMMDCXI 220 | MMMMDCLXXXXV 221 | MMMCCCLII 222 | MMCMIX 223 | MMDCCXXV 224 | MMDLXXXVI 225 | MMMMDCXXVIIII 226 | DCCCCXXXVIIII 227 | MMCCXXXIIII 228 | MMDCCLXXVIII 229 | MDCCLXVIIII 230 | MMCCLXXXV 231 | MMMMDCCCLXXXVIII 232 | MMCMXCI 233 | MDXLII 234 | MMMMDCCXIV 235 | MMMMLI 236 | DXXXXIII 237 | MMDCCXI 238 | MMMMCCLXXXIII 239 | MMMDCCCLXXIII 240 | MDCLVII 241 | MMCD 242 | MCCCXXVII 243 | MMMMDCCIIII 244 | MMMDCCXLVI 245 | MMMCLXXXVII 246 | MMMCCVIIII 247 | MCCCCLXXIX 248 | DL 249 | DCCCLXXVI 250 | MMDXCI 251 | MMMMDCCCCXXXVI 252 | MMCII 253 | MMMDCCCXXXXV 254 | MMMCDXLV 255 | MMDCXXXXIV 256 | MMD 257 | MDCCCLXXXX 258 | MMDCXLIII 259 | MMCCXXXII 260 | MMDCXXXXVIIII 261 | DCCCLXXI 262 | MDXCVIIII 263 | MMMMCCLXXVIII 264 | MDCLVIIII 265 | MMMCCCLXXXIX 266 | MDCLXXXV 267 | MDLVIII 268 | MMMMCCVII 269 | MMMMDCXIV 270 | MMMCCCLXIIII 271 | MMIIII 272 | MMMMCCCLXXIII 273 | CCIII 274 | MMMCCLV 275 | MMMDXIII 276 | MMMCCCXC 277 | MMMDCCCXXI 278 | MMMMCCCCXXXII 279 | CCCLVI 280 | MMMCCCLXXXVI 281 | MXVIIII 282 | MMMCCCCXIIII 283 | CLXVII 284 | MMMCCLXX 285 | CCCCLXIV 286 | MMXXXXII 287 | MMMMCCLXXXX 288 | MXL 289 | CCXVI 290 | CCCCLVIIII 291 | MMCCCII 292 | MCCCLVIII 293 | MMMMCCCX 294 | MCDLXXXXIV 295 | MDCCCXIII 296 | MMDCCCXL 297 | MMMMCCCXXIII 298 | DXXXIV 299 | CVI 300 | MMMMDCLXXX 301 | DCCCVII 302 | MMCMLXIIII 303 | MMMDCCCXXXIII 304 | DCCC 305 | MDIII 306 | MMCCCLXVI 307 | MMMCCCCLXXI 308 | MMDCCCCXVIII 309 | CCXXXVII 310 | CCCXXV 311 | MDCCCXII 312 | MMMCMV 313 | MMMMCMXV 314 | MMMMDCXCI 315 | DXXI 316 | MMCCXLVIIII 317 | MMMMCMLII 318 | MDLXXX 319 | MMDCLXVI 320 | CXXI 321 | MMMDCCCLIIII 322 | MMMCXXI 323 | MCCIII 324 | MMDCXXXXI 325 | CCXCII 326 | MMMMDXXXV 327 | MMMCCCLXV 328 | MMMMDLXV 329 | MMMCCCCXXXII 330 | MMMCCCVIII 331 | DCCCCLXXXXII 332 | MMCLXIV 333 | MMMMCXI 334 | MLXXXXVII 335 | MMMCDXXXVIII 336 | MDXXII 337 | MLV 338 | MMMMDLXVI 339 | MMMCXII 340 | XXXIII 341 | MMMMDCCCXXVI 342 | MMMLXVIIII 343 | MMMLX 344 | MMMCDLXVII 345 | MDCCCLVII 346 | MMCXXXVII 347 | MDCCCCXXX 348 | MMDCCCLXIII 349 | MMMMDCXLIX 350 | MMMMCMXLVIII 351 | DCCCLXXVIIII 352 | MDCCCLIII 353 | MMMCMLXI 354 | MMMMCCLXI 355 | MMDCCCLIII 356 | MMMDCCCVI 357 | MMDXXXXIX 358 | MMCLXXXXV 359 | MMDXXX 360 | MMMXIII 361 | DCLXXIX 362 | DCCLXII 363 | MMMMDCCLXVIII 364 | MDCCXXXXIII 365 | CCXXXII 366 | MMMMDCXXV 367 | MMMCCCXXVIII 368 | MDCVIII 369 | MMMCLXXXXIIII 370 | CLXXXI 371 | MDCCCCXXXIII 372 | MMMMDCXXX 373 | MMMDCXXIV 374 | MMMCCXXXVII 375 | MCCCXXXXIIII 376 | CXVIII 377 | MMDCCCCIV 378 | MMMMCDLXXV 379 | MMMDLXIV 380 | MDXCIII 381 | MCCLXXXI 382 | MMMDCCCXXIV 383 | MCXLIII 384 | MMMDCCCI 385 | MCCLXXX 386 | CCXV 387 | MMDCCLXXI 388 | MMDLXXXIII 389 | MMMMDCXVII 390 | MMMCMLXV 391 | MCLXVIII 392 | MMMMCCLXXVI 393 | MMMDCCLXVIIII 394 | MMMMDCCCIX 395 | DLXXXXIX 396 | DCCCXXII 397 | MMMMIII 398 | MMMMCCCLXXVI 399 | DCCCXCIII 400 | DXXXI 401 | MXXXIIII 402 | CCXII 403 | MMMDCCLXXXIIII 404 | MMMCXX 405 | MMMCMXXVII 406 | DCCCXXXX 407 | MMCDXXXVIIII 408 | MMMMDCCXVIII 409 | LV 410 | MMMDCCCCVI 411 | MCCCII 412 | MMCMLXVIIII 413 | MDCCXI 414 | MMMMDLXVII 415 | MMCCCCLXI 416 | MMDCCV 417 | MMMCCCXXXIIII 418 | MMMMDI 419 | MMMDCCCXCV 420 | MMDCCLXXXXI 421 | MMMDXXVI 422 | MMMDCCCLVI 423 | MMDCXXX 424 | MCCCVII 425 | MMMMCCCLXII 426 | MMMMXXV 427 | MMCMXXV 428 | MMLVI 429 | MMDXXX 430 | MMMMCVII 431 | MDC 432 | MCCIII 433 | MMMMDCC 434 | MMCCLXXV 435 | MMDCCCXXXXVI 436 | MMMMCCCLXV 437 | CDXIIII 438 | MLXIIII 439 | CCV 440 | MMMCMXXXI 441 | CCCCLXVI 442 | MDXXXII 443 | MMMMCCCLVIII 444 | MMV 445 | MMMCLII 446 | MCMLI 447 | MMDCCXX 448 | MMMMCCCCXXXVI 449 | MCCLXXXI 450 | MMMCMVI 451 | DCCXXX 452 | MMMMCCCLXV 453 | DCCCXI 454 | MMMMDCCCXIV 455 | CCCXXI 456 | MMDLXXV 457 | CCCCLXXXX 458 | MCCCLXXXXII 459 | MMDCIX 460 | DCCXLIIII 461 | DXIV 462 | MMMMCLII 463 | CDLXI 464 | MMMCXXVII 465 | MMMMDCCCCLXIII 466 | MMMDCLIIII 467 | MCCCCXXXXII 468 | MMCCCLX 469 | CCCCLIII 470 | MDCCLXXVI 471 | MCMXXIII 472 | MMMMDLXXVIII 473 | MMDCCCCLX 474 | MMMCCCLXXXX 475 | MMMCDXXVI 476 | MMMDLVIII 477 | CCCLXI 478 | MMMMDCXXII 479 | MMDCCCXXI 480 | MMDCCXIII 481 | MMMMCLXXXVI 482 | MDCCCCXXVI 483 | MDV 484 | MMDCCCCLXXVI 485 | MMMMCCXXXVII 486 | MMMDCCLXXVIIII 487 | MMMCCCCLXVII 488 | DCCXLI 489 | MMCLXXXVIII 490 | MCCXXXVI 491 | MMDCXLVIII 492 | MMMMCXXXII 493 | MMMMDCCLXVI 494 | MMMMCMLI 495 | MMMMCLXV 496 | MMMMDCCCXCIV 497 | MCCLXXVII 498 | LXXVIIII 499 | DCCLII 500 | MMMCCCXCVI 501 | MMMCLV 502 | MMDCCCXXXXVIII 503 | DCCCXV 504 | MXC 505 | MMDCCLXXXXVII 506 | MMMMCML 507 | MMDCCCLXXVIII 508 | DXXI 509 | MCCCXLI 510 | DCLXXXXI 511 | MMCCCLXXXXVIII 512 | MDCCCCLXXVIII 513 | MMMMDXXV 514 | MMMDCXXXVI 515 | MMMCMXCVII 516 | MMXVIIII 517 | MMMDCCLXXIV 518 | MMMCXXV 519 | DXXXVIII 520 | MMMMCLXVI 521 | MDXII 522 | MMCCCLXX 523 | CCLXXI 524 | DXIV 525 | MMMCLIII 526 | DLII 527 | MMMCCCXLIX 528 | MMCCCCXXVI 529 | MMDCXLIII 530 | MXXXXII 531 | CCCLXXXV 532 | MDCLXXVI 533 | MDCXII 534 | MMMCCCLXXXIII 535 | MMDCCCCLXXXII 536 | MMMMCCCLXXXV 537 | MMDCXXI 538 | DCCCXXX 539 | MMMDCCCCLII 540 | MMMDCCXXII 541 | MMMMCDXCVIII 542 | MMMCCLXVIIII 543 | MMXXV 544 | MMMMCDXIX 545 | MMMMCCCX 546 | MMMCCCCLXVI 547 | MMMMDCLXXVIIII 548 | MMMMDCXXXXIV 549 | MMMCMXII 550 | MMMMXXXIII 551 | MMMMDLXXXII 552 | DCCCLIV 553 | MDXVIIII 554 | MMMCLXXXXV 555 | CCCCXX 556 | MMDIX 557 | MMCMLXXXVIII 558 | DCCXLIII 559 | DCCLX 560 | D 561 | MCCCVII 562 | MMMMCCCLXXXIII 563 | MDCCCLXXIIII 564 | MMMDCCCCLXXXVII 565 | MMMMCCCVII 566 | MMMDCCLXXXXVI 567 | CDXXXIV 568 | MCCLXVIII 569 | MMMMDLX 570 | MMMMDXII 571 | MMMMCCCCLIIII 572 | MCMLXXXXIII 573 | MMMMDCCCIII 574 | MMDCLXXXIII 575 | MDCCCXXXXIV 576 | XXXXVII 577 | MMMDCCCXXXII 578 | MMMDCCCXLII 579 | MCXXXV 580 | MDCXXVIIII 581 | MMMCXXXXIIII 582 | MMMMCDXVII 583 | MMMDXXIII 584 | MMMMCCCCLXI 585 | DCLXXXXVIIII 586 | LXXXXI 587 | CXXXIII 588 | MCDX 589 | MCCLVII 590 | MDCXXXXII 591 | MMMCXXIV 592 | MMMMLXXXX 593 | MMDCCCCXLV 594 | MLXXX 595 | MMDCCCCLX 596 | MCDLIII 597 | MMMCCCLXVII 598 | MMMMCCCLXXIV 599 | MMMDCVIII 600 | DCCCCXXIII 601 | MMXCI 602 | MMDCCIV 603 | MMMMDCCCXXXIV 604 | CCCLXXI 605 | MCCLXXXII 606 | MCMIII 607 | CCXXXI 608 | DCCXXXVIII 609 | MMMMDCCXLVIIII 610 | MMMMCMXXXV 611 | DCCCLXXV 612 | DCCXCI 613 | MMMMDVII 614 | MMMMDCCCLXVIIII 615 | CCCXCV 616 | MMMMDCCXX 617 | MCCCCII 618 | MMMCCCXC 619 | MMMCCCII 620 | MMDCCLXXVII 621 | MMDCLIIII 622 | CCXLIII 623 | MMMDCXVIII 624 | MMMCCCIX 625 | MCXV 626 | MMCCXXV 627 | MLXXIIII 628 | MDCCXXVI 629 | MMMCCCXX 630 | MMDLXX 631 | MMCCCCVI 632 | MMDCCXX 633 | MMMMDCCCCXCV 634 | MDCCCXXXII 635 | MMMMDCCCCXXXX 636 | XCIV 637 | MMCCCCLX 638 | MMXVII 639 | MLXXI 640 | MMMDXXVIII 641 | MDCCCCII 642 | MMMCMLVII 643 | MMCLXXXXVIII 644 | MDCCCCLV 645 | MCCCCLXXIIII 646 | MCCCLII 647 | MCDXLVI 648 | MMMMDXVIII 649 | DCCLXXXIX 650 | MMMDCCLXIV 651 | MDCCCCXLIII 652 | CLXXXXV 653 | MMMMCCXXXVI 654 | MMMDCCCXXI 655 | MMMMCDLXXVII 656 | MCDLIII 657 | MMCCXLVI 658 | DCCCLV 659 | MCDLXX 660 | DCLXXVIII 661 | MMDCXXXIX 662 | MMMMDCLX 663 | MMDCCLI 664 | MMCXXXV 665 | MMMCCXII 666 | MMMMCMLXII 667 | MMMMCCV 668 | MCCCCLXIX 669 | MMMMCCIII 670 | CLXVII 671 | MCCCLXXXXIIII 672 | MMMMDCVIII 673 | MMDCCCLXI 674 | MMLXXIX 675 | CMLXIX 676 | MMDCCCXLVIIII 677 | DCLXII 678 | MMMCCCXLVII 679 | MDCCCXXXV 680 | MMMMDCCXCVI 681 | DCXXX 682 | XXVI 683 | MMLXIX 684 | MMCXI 685 | DCXXXVII 686 | MMMMCCCXXXXVIII 687 | MMMMDCLXI 688 | MMMMDCLXXIIII 689 | MMMMVIII 690 | MMMMDCCCLXII 691 | MDCXCI 692 | MMCCCXXIIII 693 | CCCCXXXXV 694 | MMDCCCXXI 695 | MCVI 696 | MMDCCLXVIII 697 | MMMMCXL 698 | MLXVIII 699 | CMXXVII 700 | CCCLV 701 | MDCCLXXXIX 702 | MMMCCCCLXV 703 | MMDCCLXII 704 | MDLXVI 705 | MMMCCCXVIII 706 | MMMMCCLXXXI 707 | MMCXXVII 708 | MMDCCCLXVIII 709 | MMMCXCII 710 | MMMMDCLVIII 711 | MMMMDCCCXXXXII 712 | MMDCCCCLXXXXVI 713 | MDCCXL 714 | MDCCLVII 715 | MMMMDCCCLXXXVI 716 | DCCXXXIII 717 | MMMMDCCCCLXXXV 718 | MMCCXXXXVIII 719 | MMMCCLXXVIII 720 | MMMDCLXXVIII 721 | DCCCI 722 | MMMMLXXXXVIIII 723 | MMMCCCCLXXII 724 | MMCLXXXVII 725 | CCLXVI 726 | MCDXLIII 727 | MMCXXVIII 728 | MDXIV 729 | CCCXCVIII 730 | CLXXVIII 731 | MMCXXXXVIIII 732 | MMMDCLXXXIV 733 | CMLVIII 734 | MCDLIX 735 | MMMMDCCCXXXII 736 | MMMMDCXXXIIII 737 | MDCXXI 738 | MMMDCXLV 739 | MCLXXVIII 740 | MCDXXII 741 | IV 742 | MCDLXXXXIII 743 | MMMMDCCLXV 744 | CCLI 745 | MMMMDCCCXXXVIII 746 | DCLXII 747 | MCCCLXVII 748 | MMMMDCCCXXXVI 749 | MMDCCXLI 750 | MLXI 751 | MMMCDLXVIII 752 | MCCCCXCIII 753 | XXXIII 754 | MMMDCLXIII 755 | MMMMDCL 756 | DCCCXXXXIIII 757 | MMDLVII 758 | DXXXVII 759 | MCCCCXXIIII 760 | MCVII 761 | MMMMDCCXL 762 | MMMMCXXXXIIII 763 | MCCCCXXIV 764 | MMCLXVIII 765 | MMXCIII 766 | MDCCLXXX 767 | MCCCLIIII 768 | MMDCLXXI 769 | MXI 770 | MCMLIV 771 | MMMCCIIII 772 | DCCLXXXVIIII 773 | MDCLIV 774 | MMMDCXIX 775 | CMLXXXI 776 | DCCLXXXVII 777 | XXV 778 | MMMXXXVI 779 | MDVIIII 780 | CLXIII 781 | MMMCDLVIIII 782 | MMCCCCVII 783 | MMMLXX 784 | MXXXXII 785 | MMMMCCCLXVIII 786 | MMDCCCXXVIII 787 | MMMMDCXXXXI 788 | MMMMDCCCXXXXV 789 | MMMXV 790 | MMMMCCXVIIII 791 | MMDCCXIIII 792 | MMMXXVII 793 | MDCCLVIIII 794 | MMCXXIIII 795 | MCCCLXXIV 796 | DCLVIII 797 | MMMLVII 798 | MMMCXLV 799 | MMXCVII 800 | MMMCCCLXXXVII 801 | MMMMCCXXII 802 | DXII 803 | MMMDLV 804 | MCCCLXXVIII 805 | MMMCLIIII 806 | MMMMCLXXXX 807 | MMMCLXXXIIII 808 | MDCXXIII 809 | MMMMCCXVI 810 | MMMMDLXXXIII 811 | MMMDXXXXIII 812 | MMMMCCCCLV 813 | MMMDLXXXI 814 | MMMCCLXXVI 815 | MMMMXX 816 | MMMMDLVI 817 | MCCCCLXXX 818 | MMMXXII 819 | MMXXII 820 | MMDCCCCXXXI 821 | MMMDXXV 822 | MMMDCLXXXVIIII 823 | MMMDLXXXXVII 824 | MDLXIIII 825 | CMXC 826 | MMMXXXVIII 827 | MDLXXXVIII 828 | MCCCLXXVI 829 | MMCDLIX 830 | MMDCCCXVIII 831 | MDCCCXXXXVI 832 | MMMMCMIV 833 | MMMMDCIIII 834 | MMCCXXXV 835 | XXXXVI 836 | MMMMCCXVII 837 | MMCCXXIV 838 | MCMLVIIII 839 | MLXXXIX 840 | MMMMLXXXIX 841 | CLXXXXIX 842 | MMMDCCCCLVIII 843 | MMMMCCLXXIII 844 | MCCCC 845 | DCCCLIX 846 | MMMCCCLXXXII 847 | MMMCCLXVIIII 848 | MCLXXXV 849 | CDLXXXVII 850 | DCVI 851 | MMX 852 | MMCCXIII 853 | MMMMDCXX 854 | MMMMXXVIII 855 | DCCCLXII 856 | MMMMCCCXLIII 857 | MMMMCLXV 858 | DXCI 859 | MMMMCLXXX 860 | MMMDCCXXXXI 861 | MMMMXXXXVI 862 | DCLX 863 | MMMCCCXI 864 | MCCLXXX 865 | MMCDLXXII 866 | DCCLXXI 867 | MMMCCCXXXVI 868 | MCCCCLXXXVIIII 869 | CDLVIII 870 | DCCLVI 871 | MMMMDCXXXVIII 872 | MMCCCLXXXIII 873 | MMMMDCCLXXV 874 | MMMXXXVI 875 | CCCLXXXXIX 876 | CV 877 | CCCCXIII 878 | CCCCXVI 879 | MDCCCLXXXIIII 880 | MMDCCLXXXII 881 | MMMMCCCCLXXXI 882 | MXXV 883 | MMCCCLXXVIIII 884 | MMMCCXII 885 | MMMMCCXXXIII 886 | MMCCCLXXXVI 887 | MMMDCCCLVIIII 888 | MCCXXXVII 889 | MDCLXXV 890 | XXXV 891 | MMDLI 892 | MMMCCXXX 893 | MMMMCXXXXV 894 | CCCCLIX 895 | MMMMDCCCLXXIII 896 | MMCCCXVII 897 | DCCCXVI 898 | MMMCCCXXXXV 899 | MDCCCCXCV 900 | CLXXXI 901 | MMMMDCCLXX 902 | MMMDCCCIII 903 | MMCLXXVII 904 | MMMDCCXXIX 905 | MMDCCCXCIIII 906 | MMMCDXXIIII 907 | MMMMXXVIII 908 | MMMMDCCCCLXVIII 909 | MDCCCXX 910 | MMMMCDXXI 911 | MMMMDLXXXIX 912 | CCXVI 913 | MDVIII 914 | MMCCLXXI 915 | MMMDCCCLXXI 916 | MMMCCCLXXVI 917 | MMCCLXI 918 | MMMMDCCCXXXIV 919 | DLXXXVI 920 | MMMMDXXXII 921 | MMMXXIIII 922 | MMMMCDIV 923 | MMMMCCCXLVIII 924 | MMMMCXXXVIII 925 | MMMCCCLXVI 926 | MDCCXVIII 927 | MMCXX 928 | CCCLIX 929 | MMMMDCCLXXII 930 | MDCCCLXXV 931 | MMMMDCCCXXIV 932 | DCCCXXXXVIII 933 | MMMDCCCCXXXVIIII 934 | MMMMCCXXXV 935 | MDCLXXXIII 936 | MMCCLXXXIV 937 | MCLXXXXIIII 938 | DXXXXIII 939 | MCCCXXXXVIII 940 | MMCLXXIX 941 | MMMMCCLXIV 942 | MXXII 943 | MMMCXIX 944 | MDCXXXVII 945 | MMDCCVI 946 | MCLXXXXVIII 947 | MMMCXVI 948 | MCCCLX 949 | MMMCDX 950 | CCLXVIIII 951 | MMMCCLX 952 | MCXXVIII 953 | LXXXII 954 | MCCCCLXXXI 955 | MMMI 956 | MMMCCCLXIV 957 | MMMCCCXXVIIII 958 | CXXXVIII 959 | MMCCCXX 960 | MMMCCXXVIIII 961 | MCCLXVI 962 | MMMCCCCXXXXVI 963 | MMDCCXCIX 964 | MCMLXXI 965 | MMCCLXVIII 966 | CDLXXXXIII 967 | MMMMDCCXXII 968 | MMMMDCCLXXXVII 969 | MMMDCCLIV 970 | MMCCLXIII 971 | MDXXXVII 972 | DCCXXXIIII 973 | MCII 974 | MMMDCCCLXXI 975 | MMMLXXIII 976 | MDCCCLIII 977 | MMXXXVIII 978 | MDCCXVIIII 979 | MDCCCCXXXVII 980 | MMCCCXVI 981 | MCMXXII 982 | MMMCCCLVIII 983 | MMMMDCCCXX 984 | MCXXIII 985 | MMMDLXI 986 | MMMMDXXII 987 | MDCCCX 988 | MMDXCVIIII 989 | MMMDCCCCVIII 990 | MMMMDCCCCXXXXVI 991 | MMDCCCXXXV 992 | MMCXCIV 993 | MCMLXXXXIII 994 | MMMCCCLXXVI 995 | MMMMDCLXXXV 996 | CMLXIX 997 | DCXCII 998 | MMXXVIII 999 | MMMMCCCXXX 1000 | XXXXVIIII -------------------------------------------------------------------------------- /data/ep99.txt: -------------------------------------------------------------------------------- 1 | 519432,525806 2 | 632382,518061 3 | 78864,613712 4 | 466580,530130 5 | 780495,510032 6 | 525895,525320 7 | 15991,714883 8 | 960290,502358 9 | 760018,511029 10 | 166800,575487 11 | 210884,564478 12 | 555151,523163 13 | 681146,515199 14 | 563395,522587 15 | 738250,512126 16 | 923525,503780 17 | 595148,520429 18 | 177108,572629 19 | 750923,511482 20 | 440902,532446 21 | 881418,505504 22 | 422489,534197 23 | 979858,501616 24 | 685893,514935 25 | 747477,511661 26 | 167214,575367 27 | 234140,559696 28 | 940238,503122 29 | 728969,512609 30 | 232083,560102 31 | 900971,504694 32 | 688801,514772 33 | 189664,569402 34 | 891022,505104 35 | 445689,531996 36 | 119570,591871 37 | 821453,508118 38 | 371084,539600 39 | 911745,504251 40 | 623655,518600 41 | 144361,582486 42 | 352442,541775 43 | 420726,534367 44 | 295298,549387 45 | 6530,787777 46 | 468397,529976 47 | 672336,515696 48 | 431861,533289 49 | 84228,610150 50 | 805376,508857 51 | 444409,532117 52 | 33833,663511 53 | 381850,538396 54 | 402931,536157 55 | 92901,604930 56 | 304825,548004 57 | 731917,512452 58 | 753734,511344 59 | 51894,637373 60 | 151578,580103 61 | 295075,549421 62 | 303590,548183 63 | 333594,544123 64 | 683952,515042 65 | 60090,628880 66 | 951420,502692 67 | 28335,674991 68 | 714940,513349 69 | 343858,542826 70 | 549279,523586 71 | 804571,508887 72 | 260653,554881 73 | 291399,549966 74 | 402342,536213 75 | 408889,535550 76 | 40328,652524 77 | 375856,539061 78 | 768907,510590 79 | 165993,575715 80 | 976327,501755 81 | 898500,504795 82 | 360404,540830 83 | 478714,529095 84 | 694144,514472 85 | 488726,528258 86 | 841380,507226 87 | 328012,544839 88 | 22389,690868 89 | 604053,519852 90 | 329514,544641 91 | 772965,510390 92 | 492798,527927 93 | 30125,670983 94 | 895603,504906 95 | 450785,531539 96 | 840237,507276 97 | 380711,538522 98 | 63577,625673 99 | 76801,615157 100 | 502694,527123 101 | 597706,520257 102 | 310484,547206 103 | 944468,502959 104 | 121283,591152 105 | 451131,531507 106 | 566499,522367 107 | 425373,533918 108 | 40240,652665 109 | 39130,654392 110 | 714926,513355 111 | 469219,529903 112 | 806929,508783 113 | 287970,550487 114 | 92189,605332 115 | 103841,599094 116 | 671839,515725 117 | 452048,531421 118 | 987837,501323 119 | 935192,503321 120 | 88585,607450 121 | 613883,519216 122 | 144551,582413 123 | 647359,517155 124 | 213902,563816 125 | 184120,570789 126 | 258126,555322 127 | 502546,527130 128 | 407655,535678 129 | 401528,536306 130 | 477490,529193 131 | 841085,507237 132 | 732831,512408 133 | 833000,507595 134 | 904694,504542 135 | 581435,521348 136 | 455545,531110 137 | 873558,505829 138 | 94916,603796 139 | 720176,513068 140 | 545034,523891 141 | 246348,557409 142 | 556452,523079 143 | 832015,507634 144 | 173663,573564 145 | 502634,527125 146 | 250732,556611 147 | 569786,522139 148 | 216919,563178 149 | 521815,525623 150 | 92304,605270 151 | 164446,576167 152 | 753413,511364 153 | 11410,740712 154 | 448845,531712 155 | 925072,503725 156 | 564888,522477 157 | 7062,780812 158 | 641155,517535 159 | 738878,512100 160 | 636204,517828 161 | 372540,539436 162 | 443162,532237 163 | 571192,522042 164 | 655350,516680 165 | 299741,548735 166 | 581914,521307 167 | 965471,502156 168 | 513441,526277 169 | 808682,508700 170 | 237589,559034 171 | 543300,524025 172 | 804712,508889 173 | 247511,557192 174 | 543486,524008 175 | 504383,526992 176 | 326529,545039 177 | 792493,509458 178 | 86033,609017 179 | 126554,589005 180 | 579379,521481 181 | 948026,502823 182 | 404777,535969 183 | 265767,554022 184 | 266876,553840 185 | 46631,643714 186 | 492397,527958 187 | 856106,506581 188 | 795757,509305 189 | 748946,511584 190 | 294694,549480 191 | 409781,535463 192 | 775887,510253 193 | 543747,523991 194 | 210592,564536 195 | 517119,525990 196 | 520253,525751 197 | 247926,557124 198 | 592141,520626 199 | 346580,542492 200 | 544969,523902 201 | 506501,526817 202 | 244520,557738 203 | 144745,582349 204 | 69274,620858 205 | 292620,549784 206 | 926027,503687 207 | 736320,512225 208 | 515528,526113 209 | 407549,535688 210 | 848089,506927 211 | 24141,685711 212 | 9224,757964 213 | 980684,501586 214 | 175259,573121 215 | 489160,528216 216 | 878970,505604 217 | 969546,502002 218 | 525207,525365 219 | 690461,514675 220 | 156510,578551 221 | 659778,516426 222 | 468739,529945 223 | 765252,510770 224 | 76703,615230 225 | 165151,575959 226 | 29779,671736 227 | 928865,503569 228 | 577538,521605 229 | 927555,503618 230 | 185377,570477 231 | 974756,501809 232 | 800130,509093 233 | 217016,563153 234 | 365709,540216 235 | 774508,510320 236 | 588716,520851 237 | 631673,518104 238 | 954076,502590 239 | 777828,510161 240 | 990659,501222 241 | 597799,520254 242 | 786905,509727 243 | 512547,526348 244 | 756449,511212 245 | 869787,505988 246 | 653747,516779 247 | 84623,609900 248 | 839698,507295 249 | 30159,670909 250 | 797275,509234 251 | 678136,515373 252 | 897144,504851 253 | 989554,501263 254 | 413292,535106 255 | 55297,633667 256 | 788650,509637 257 | 486748,528417 258 | 150724,580377 259 | 56434,632490 260 | 77207,614869 261 | 588631,520859 262 | 611619,519367 263 | 100006,601055 264 | 528924,525093 265 | 190225,569257 266 | 851155,506789 267 | 682593,515114 268 | 613043,519275 269 | 514673,526183 270 | 877634,505655 271 | 878905,505602 272 | 1926,914951 273 | 613245,519259 274 | 152481,579816 275 | 841774,507203 276 | 71060,619442 277 | 865335,506175 278 | 90244,606469 279 | 302156,548388 280 | 399059,536557 281 | 478465,529113 282 | 558601,522925 283 | 69132,620966 284 | 267663,553700 285 | 988276,501310 286 | 378354,538787 287 | 529909,525014 288 | 161733,576968 289 | 758541,511109 290 | 823425,508024 291 | 149821,580667 292 | 269258,553438 293 | 481152,528891 294 | 120871,591322 295 | 972322,501901 296 | 981350,501567 297 | 676129,515483 298 | 950860,502717 299 | 119000,592114 300 | 392252,537272 301 | 191618,568919 302 | 946699,502874 303 | 289555,550247 304 | 799322,509139 305 | 703886,513942 306 | 194812,568143 307 | 261823,554685 308 | 203052,566221 309 | 217330,563093 310 | 734748,512313 311 | 391759,537328 312 | 807052,508777 313 | 564467,522510 314 | 59186,629748 315 | 113447,594545 316 | 518063,525916 317 | 905944,504492 318 | 613922,519213 319 | 439093,532607 320 | 445946,531981 321 | 230530,560399 322 | 297887,549007 323 | 459029,530797 324 | 403692,536075 325 | 855118,506616 326 | 963127,502245 327 | 841711,507208 328 | 407411,535699 329 | 924729,503735 330 | 914823,504132 331 | 333725,544101 332 | 176345,572832 333 | 912507,504225 334 | 411273,535308 335 | 259774,555036 336 | 632853,518038 337 | 119723,591801 338 | 163902,576321 339 | 22691,689944 340 | 402427,536212 341 | 175769,572988 342 | 837260,507402 343 | 603432,519893 344 | 313679,546767 345 | 538165,524394 346 | 549026,523608 347 | 61083,627945 348 | 898345,504798 349 | 992556,501153 350 | 369999,539727 351 | 32847,665404 352 | 891292,505088 353 | 152715,579732 354 | 824104,507997 355 | 234057,559711 356 | 730507,512532 357 | 960529,502340 358 | 388395,537687 359 | 958170,502437 360 | 57105,631806 361 | 186025,570311 362 | 993043,501133 363 | 576770,521664 364 | 215319,563513 365 | 927342,503628 366 | 521353,525666 367 | 39563,653705 368 | 752516,511408 369 | 110755,595770 370 | 309749,547305 371 | 374379,539224 372 | 919184,503952 373 | 990652,501226 374 | 647780,517135 375 | 187177,570017 376 | 168938,574877 377 | 649558,517023 378 | 278126,552016 379 | 162039,576868 380 | 658512,516499 381 | 498115,527486 382 | 896583,504868 383 | 561170,522740 384 | 747772,511647 385 | 775093,510294 386 | 652081,516882 387 | 724905,512824 388 | 499707,527365 389 | 47388,642755 390 | 646668,517204 391 | 571700,522007 392 | 180430,571747 393 | 710015,513617 394 | 435522,532941 395 | 98137,602041 396 | 759176,511070 397 | 486124,528467 398 | 526942,525236 399 | 878921,505604 400 | 408313,535602 401 | 926980,503640 402 | 882353,505459 403 | 566887,522345 404 | 3326,853312 405 | 911981,504248 406 | 416309,534800 407 | 392991,537199 408 | 622829,518651 409 | 148647,581055 410 | 496483,527624 411 | 666314,516044 412 | 48562,641293 413 | 672618,515684 414 | 443676,532187 415 | 274065,552661 416 | 265386,554079 417 | 347668,542358 418 | 31816,667448 419 | 181575,571446 420 | 961289,502320 421 | 365689,540214 422 | 987950,501317 423 | 932299,503440 424 | 27388,677243 425 | 746701,511701 426 | 492258,527969 427 | 147823,581323 428 | 57918,630985 429 | 838849,507333 430 | 678038,515375 431 | 27852,676130 432 | 850241,506828 433 | 818403,508253 434 | 131717,587014 435 | 850216,506834 436 | 904848,504529 437 | 189758,569380 438 | 392845,537217 439 | 470876,529761 440 | 925353,503711 441 | 285431,550877 442 | 454098,531234 443 | 823910,508003 444 | 318493,546112 445 | 766067,510730 446 | 261277,554775 447 | 421530,534289 448 | 694130,514478 449 | 120439,591498 450 | 213308,563949 451 | 854063,506662 452 | 365255,540263 453 | 165437,575872 454 | 662240,516281 455 | 289970,550181 456 | 847977,506933 457 | 546083,523816 458 | 413252,535113 459 | 975829,501767 460 | 361540,540701 461 | 235522,559435 462 | 224643,561577 463 | 736350,512229 464 | 328303,544808 465 | 35022,661330 466 | 307838,547578 467 | 474366,529458 468 | 873755,505819 469 | 73978,617220 470 | 827387,507845 471 | 670830,515791 472 | 326511,545034 473 | 309909,547285 474 | 400970,536363 475 | 884827,505352 476 | 718307,513175 477 | 28462,674699 478 | 599384,520150 479 | 253565,556111 480 | 284009,551093 481 | 343403,542876 482 | 446557,531921 483 | 992372,501160 484 | 961601,502308 485 | 696629,514342 486 | 919537,503945 487 | 894709,504944 488 | 892201,505051 489 | 358160,541097 490 | 448503,531745 491 | 832156,507636 492 | 920045,503924 493 | 926137,503675 494 | 416754,534757 495 | 254422,555966 496 | 92498,605151 497 | 826833,507873 498 | 660716,516371 499 | 689335,514746 500 | 160045,577467 501 | 814642,508425 502 | 969939,501993 503 | 242856,558047 504 | 76302,615517 505 | 472083,529653 506 | 587101,520964 507 | 99066,601543 508 | 498005,527503 509 | 709800,513624 510 | 708000,513716 511 | 20171,698134 512 | 285020,550936 513 | 266564,553891 514 | 981563,501557 515 | 846502,506991 516 | 334,1190800 517 | 209268,564829 518 | 9844,752610 519 | 996519,501007 520 | 410059,535426 521 | 432931,533188 522 | 848012,506929 523 | 966803,502110 524 | 983434,501486 525 | 160700,577267 526 | 504374,526989 527 | 832061,507640 528 | 392825,537214 529 | 443842,532165 530 | 440352,532492 531 | 745125,511776 532 | 13718,726392 533 | 661753,516312 534 | 70500,619875 535 | 436952,532814 536 | 424724,533973 537 | 21954,692224 538 | 262490,554567 539 | 716622,513264 540 | 907584,504425 541 | 60086,628882 542 | 837123,507412 543 | 971345,501940 544 | 947162,502855 545 | 139920,584021 546 | 68330,621624 547 | 666452,516038 548 | 731446,512481 549 | 953350,502619 550 | 183157,571042 551 | 845400,507045 552 | 651548,516910 553 | 20399,697344 554 | 861779,506331 555 | 629771,518229 556 | 801706,509026 557 | 189207,569512 558 | 737501,512168 559 | 719272,513115 560 | 479285,529045 561 | 136046,585401 562 | 896746,504860 563 | 891735,505067 564 | 684771,514999 565 | 865309,506184 566 | 379066,538702 567 | 503117,527090 568 | 621780,518717 569 | 209518,564775 570 | 677135,515423 571 | 987500,501340 572 | 197049,567613 573 | 329315,544673 574 | 236756,559196 575 | 357092,541226 576 | 520440,525733 577 | 213471,563911 578 | 956852,502490 579 | 702223,514032 580 | 404943,535955 581 | 178880,572152 582 | 689477,514734 583 | 691351,514630 584 | 866669,506128 585 | 370561,539656 586 | 739805,512051 587 | 71060,619441 588 | 624861,518534 589 | 261660,554714 590 | 366137,540160 591 | 166054,575698 592 | 601878,519990 593 | 153445,579501 594 | 279899,551729 595 | 379166,538691 596 | 423209,534125 597 | 675310,515526 598 | 145641,582050 599 | 691353,514627 600 | 917468,504026 601 | 284778,550976 602 | 81040,612235 603 | 161699,576978 604 | 616394,519057 605 | 767490,510661 606 | 156896,578431 607 | 427408,533714 608 | 254849,555884 609 | 737217,512182 610 | 897133,504851 611 | 203815,566051 612 | 270822,553189 613 | 135854,585475 614 | 778805,510111 615 | 784373,509847 616 | 305426,547921 617 | 733418,512375 618 | 732087,512448 619 | 540668,524215 620 | 702898,513996 621 | 628057,518328 622 | 640280,517587 623 | 422405,534204 624 | 10604,746569 625 | 746038,511733 626 | 839808,507293 627 | 457417,530938 628 | 479030,529064 629 | 341758,543090 630 | 620223,518824 631 | 251661,556451 632 | 561790,522696 633 | 497733,527521 634 | 724201,512863 635 | 489217,528217 636 | 415623,534867 637 | 624610,518548 638 | 847541,506953 639 | 432295,533249 640 | 400391,536421 641 | 961158,502319 642 | 139173,584284 643 | 421225,534315 644 | 579083,521501 645 | 74274,617000 646 | 701142,514087 647 | 374465,539219 648 | 217814,562985 649 | 358972,540995 650 | 88629,607424 651 | 288597,550389 652 | 285819,550812 653 | 538400,524385 654 | 809930,508645 655 | 738326,512126 656 | 955461,502535 657 | 163829,576343 658 | 826475,507891 659 | 376488,538987 660 | 102234,599905 661 | 114650,594002 662 | 52815,636341 663 | 434037,533082 664 | 804744,508880 665 | 98385,601905 666 | 856620,506559 667 | 220057,562517 668 | 844734,507078 669 | 150677,580387 670 | 558697,522917 671 | 621751,518719 672 | 207067,565321 673 | 135297,585677 674 | 932968,503404 675 | 604456,519822 676 | 579728,521462 677 | 244138,557813 678 | 706487,513800 679 | 711627,513523 680 | 853833,506674 681 | 497220,527562 682 | 59428,629511 683 | 564845,522486 684 | 623621,518603 685 | 242689,558077 686 | 125091,589591 687 | 363819,540432 688 | 686453,514901 689 | 656813,516594 690 | 489901,528155 691 | 386380,537905 692 | 542819,524052 693 | 243987,557841 694 | 693412,514514 695 | 488484,528271 696 | 896331,504881 697 | 336730,543721 698 | 728298,512647 699 | 604215,519840 700 | 153729,579413 701 | 595687,520398 702 | 540360,524240 703 | 245779,557511 704 | 924873,503730 705 | 509628,526577 706 | 528523,525122 707 | 3509,847707 708 | 522756,525555 709 | 895447,504922 710 | 44840,646067 711 | 45860,644715 712 | 463487,530404 713 | 398164,536654 714 | 894483,504959 715 | 619415,518874 716 | 966306,502129 717 | 990922,501212 718 | 835756,507474 719 | 548881,523618 720 | 453578,531282 721 | 474993,529410 722 | 80085,612879 723 | 737091,512193 724 | 50789,638638 725 | 979768,501620 726 | 792018,509483 727 | 665001,516122 728 | 86552,608694 729 | 462772,530469 730 | 589233,520821 731 | 891694,505072 732 | 592605,520594 733 | 209645,564741 734 | 42531,649269 735 | 554376,523226 736 | 803814,508929 737 | 334157,544042 738 | 175836,572970 739 | 868379,506051 740 | 658166,516520 741 | 278203,551995 742 | 966198,502126 743 | 627162,518387 744 | 296774,549165 745 | 311803,547027 746 | 843797,507118 747 | 702304,514032 748 | 563875,522553 749 | 33103,664910 750 | 191932,568841 751 | 543514,524006 752 | 506835,526794 753 | 868368,506052 754 | 847025,506971 755 | 678623,515342 756 | 876139,505726 757 | 571997,521984 758 | 598632,520198 759 | 213590,563892 760 | 625404,518497 761 | 726508,512738 762 | 689426,514738 763 | 332495,544264 764 | 411366,535302 765 | 242546,558110 766 | 315209,546555 767 | 797544,509219 768 | 93889,604371 769 | 858879,506454 770 | 124906,589666 771 | 449072,531693 772 | 235960,559345 773 | 642403,517454 774 | 720567,513047 775 | 705534,513858 776 | 603692,519870 777 | 488137,528302 778 | 157370,578285 779 | 63515,625730 780 | 666326,516041 781 | 619226,518883 782 | 443613,532186 783 | 597717,520257 784 | 96225,603069 785 | 86940,608450 786 | 40725,651929 787 | 460976,530625 788 | 268875,553508 789 | 270671,553214 790 | 363254,540500 791 | 384248,538137 792 | 762889,510892 793 | 377941,538833 794 | 278878,551890 795 | 176615,572755 796 | 860008,506412 797 | 944392,502967 798 | 608395,519571 799 | 225283,561450 800 | 45095,645728 801 | 333798,544090 802 | 625733,518476 803 | 995584,501037 804 | 506135,526853 805 | 238050,558952 806 | 557943,522972 807 | 530978,524938 808 | 634244,517949 809 | 177168,572616 810 | 85200,609541 811 | 953043,502630 812 | 523661,525484 813 | 999295,500902 814 | 840803,507246 815 | 961490,502312 816 | 471747,529685 817 | 380705,538523 818 | 911180,504275 819 | 334149,544046 820 | 478992,529065 821 | 325789,545133 822 | 335884,543826 823 | 426976,533760 824 | 749007,511582 825 | 667067,516000 826 | 607586,519623 827 | 674054,515599 828 | 188534,569675 829 | 565185,522464 830 | 172090,573988 831 | 87592,608052 832 | 907432,504424 833 | 8912,760841 834 | 928318,503590 835 | 757917,511138 836 | 718693,513153 837 | 315141,546566 838 | 728326,512645 839 | 353492,541647 840 | 638429,517695 841 | 628892,518280 842 | 877286,505672 843 | 620895,518778 844 | 385878,537959 845 | 423311,534113 846 | 633501,517997 847 | 884833,505360 848 | 883402,505416 849 | 999665,500894 850 | 708395,513697 851 | 548142,523667 852 | 756491,511205 853 | 987352,501340 854 | 766520,510705 855 | 591775,520647 856 | 833758,507563 857 | 843890,507108 858 | 925551,503698 859 | 74816,616598 860 | 646942,517187 861 | 354923,541481 862 | 256291,555638 863 | 634470,517942 864 | 930904,503494 865 | 134221,586071 866 | 282663,551304 867 | 986070,501394 868 | 123636,590176 869 | 123678,590164 870 | 481717,528841 871 | 423076,534137 872 | 866246,506145 873 | 93313,604697 874 | 783632,509880 875 | 317066,546304 876 | 502977,527103 877 | 141272,583545 878 | 71708,618938 879 | 617748,518975 880 | 581190,521362 881 | 193824,568382 882 | 682368,515131 883 | 352956,541712 884 | 351375,541905 885 | 505362,526909 886 | 905165,504518 887 | 128645,588188 888 | 267143,553787 889 | 158409,577965 890 | 482776,528754 891 | 628896,518282 892 | 485233,528547 893 | 563606,522574 894 | 111001,595655 895 | 115920,593445 896 | 365510,540237 897 | 959724,502374 898 | 938763,503184 899 | 930044,503520 900 | 970959,501956 901 | 913658,504176 902 | 68117,621790 903 | 989729,501253 904 | 567697,522288 905 | 820427,508163 906 | 54236,634794 907 | 291557,549938 908 | 124961,589646 909 | 403177,536130 910 | 405421,535899 911 | 410233,535417 912 | 815111,508403 913 | 213176,563974 914 | 83099,610879 915 | 998588,500934 916 | 513640,526263 917 | 129817,587733 918 | 1820,921851 919 | 287584,550539 920 | 299160,548820 921 | 860621,506386 922 | 529258,525059 923 | 586297,521017 924 | 953406,502616 925 | 441234,532410 926 | 986217,501386 927 | 781938,509957 928 | 461247,530595 929 | 735424,512277 930 | 146623,581722 931 | 839838,507288 932 | 510667,526494 933 | 935085,503327 934 | 737523,512167 935 | 303455,548204 936 | 992779,501145 937 | 60240,628739 938 | 939095,503174 939 | 794368,509370 940 | 501825,527189 941 | 459028,530798 942 | 884641,505363 943 | 512287,526364 944 | 835165,507499 945 | 307723,547590 946 | 160587,577304 947 | 735043,512300 948 | 493289,527887 949 | 110717,595785 950 | 306480,547772 951 | 318593,546089 952 | 179810,571911 953 | 200531,566799 954 | 314999,546580 955 | 197020,567622 956 | 301465,548487 957 | 237808,559000 958 | 131944,586923 959 | 882527,505449 960 | 468117,530003 961 | 711319,513541 962 | 156240,578628 963 | 965452,502162 964 | 992756,501148 965 | 437959,532715 966 | 739938,512046 967 | 614249,519196 968 | 391496,537356 969 | 62746,626418 970 | 688215,514806 971 | 75501,616091 972 | 883573,505412 973 | 558824,522910 974 | 759371,511061 975 | 173913,573489 976 | 891351,505089 977 | 727464,512693 978 | 164833,576051 979 | 812317,508529 980 | 540320,524243 981 | 698061,514257 982 | 69149,620952 983 | 471673,529694 984 | 159092,577753 985 | 428134,533653 986 | 89997,606608 987 | 711061,513557 988 | 779403,510081 989 | 203327,566155 990 | 798176,509187 991 | 667688,515963 992 | 636120,517833 993 | 137410,584913 994 | 217615,563034 995 | 556887,523038 996 | 667229,515991 997 | 672276,515708 998 | 325361,545187 999 | 172115,573985 1000 | 13846,725685 -------------------------------------------------------------------------------- /data/ep81.txt: -------------------------------------------------------------------------------- 1 | 4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 2 | 1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 3 | 9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 4 | 7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 5 | 3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 6 | 1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 7 | 4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 8 | 510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 9 | 9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 10 | 3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 11 | 6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 12 | 7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 13 | 4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 14 | 356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 15 | 9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 16 | 192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 17 | 1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 18 | 4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 19 | 5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 20 | 1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 21 | 1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 22 | 8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 23 | 7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 24 | 3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 25 | 9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 26 | 5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 27 | 6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 28 | 9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 29 | 5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 30 | 6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 31 | 5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 32 | 1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 33 | 4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 34 | 4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 35 | 8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 36 | 2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 37 | 6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 38 | 2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 39 | 6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 40 | 3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 41 | 5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 42 | 3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 43 | 1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 44 | 8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 45 | 3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 46 | 8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 47 | 8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 48 | 9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 49 | 3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 50 | 1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 51 | 7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 52 | 9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 53 | 7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 54 | 3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 55 | 1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 56 | 126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 57 | 8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 58 | 7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 59 | 4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 60 | 4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 61 | 7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 62 | 7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 63 | 6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 64 | 4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 65 | 9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 66 | 3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 67 | 2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 68 | 3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 69 | 4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 70 | 171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 71 | 3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 72 | 2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 73 | 7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 74 | 8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 75 | 2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 76 | 6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 77 | 8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 78 | 2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 79 | 2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 80 | 5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 81 | --------------------------------------------------------------------------------