├── .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 |
4 |
5 |
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 |
10 |
11 |
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 | 
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 |
--------------------------------------------------------------------------------