Added solutions for N=110-120
parent
9fcd15dba8
commit
f4b1fbcafb
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from lib import primegen
|
||||||
|
from math import log
|
||||||
|
from operator import mul
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
|
def calc(pows):
|
||||||
|
return (reduce(mul, (2*p + 1 for p in pows)) + 1) // 2
|
||||||
|
|
||||||
|
def increment(i, pows):
|
||||||
|
n = 0
|
||||||
|
if i < len(pows):
|
||||||
|
n = pows[i]
|
||||||
|
return [n + 1] * (i+1) + pows[i+1:]
|
||||||
|
|
||||||
|
def val(pows):
|
||||||
|
return sum(p*v for p, v in zip(pows, vals))
|
||||||
|
|
||||||
|
def fpwof2(pows, n):
|
||||||
|
if len(pows) == 1:
|
||||||
|
return n-1
|
||||||
|
r = (2*n - 1) // reduce(mul, (2*p + 1 for p in pows[1:]))
|
||||||
|
r = (r - 1) // 2
|
||||||
|
while calc([r] + pows[1:]) < n:
|
||||||
|
r += 1
|
||||||
|
return r
|
||||||
|
|
||||||
|
N = 4 * 10**6
|
||||||
|
|
||||||
|
primes = list(primegen(100))
|
||||||
|
vals = [log(p) / log(2) for p in primes]
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
pows = [0]
|
||||||
|
best = fpwof2(pows, N)
|
||||||
|
best_pows = None
|
||||||
|
|
||||||
|
while not (val(pows) >= best and sum(pows) == len(pows)):
|
||||||
|
if not i:
|
||||||
|
pows[0] = fpwof2(pows, N)
|
||||||
|
if len(pows) > 1 and pows[0] < pows[1]:
|
||||||
|
pows[0] = pows[1]
|
||||||
|
if val(pows) < best:
|
||||||
|
best = val(pows)
|
||||||
|
best_pows = pows
|
||||||
|
i = 1
|
||||||
|
pows = increment(i, pows)
|
||||||
|
if val(pows) >= best:
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
print(reduce(mul, (n**pw for n, pw in zip(primes, best_pows))))
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from itertools import combinations, product
|
||||||
|
|
||||||
|
def primes(n):
|
||||||
|
sieve = [True] * n
|
||||||
|
for p in range(2, int(n**0.5)+1):
|
||||||
|
if not sieve[p]:
|
||||||
|
continue
|
||||||
|
for i in range(p**2, n, p):
|
||||||
|
sieve[i] = False
|
||||||
|
return [False, False] + sieve[2:]
|
||||||
|
|
||||||
|
|
||||||
|
def is_prime(n):
|
||||||
|
for p in range(2, int(n**0.5)+1):
|
||||||
|
if sieve[p] and n%p==0:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
digs = 10
|
||||||
|
sieve = primes(10**6)
|
||||||
|
|
||||||
|
ts = 0
|
||||||
|
|
||||||
|
for dig in range(10):
|
||||||
|
c = 0
|
||||||
|
s = 0
|
||||||
|
num = str(dig) * digs
|
||||||
|
for rp in range(1,digs):
|
||||||
|
for comb in combinations(range(digs), rp):
|
||||||
|
if dig == 0 and comb[0] != 0:
|
||||||
|
continue
|
||||||
|
for perm in product(range(10), repeat=rp):
|
||||||
|
n = num
|
||||||
|
for i, d in zip(comb, perm):
|
||||||
|
n = n[:i] + str(d) + n[i+1:]
|
||||||
|
if is_prime(int(n)) and n[0] != "0":
|
||||||
|
c += 1
|
||||||
|
s += int(n)
|
||||||
|
if c:
|
||||||
|
break
|
||||||
|
ts += s
|
||||||
|
#print("{} {} {:3} {}".format(dig, digs-rp, c, s))
|
||||||
|
|
||||||
|
print(ts)
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Brute force
|
||||||
|
|
||||||
|
def main(x):
|
||||||
|
i = 100
|
||||||
|
bc = 0
|
||||||
|
while 100*bc // i != x:
|
||||||
|
i += 1
|
||||||
|
bc += is_bouncy(i)
|
||||||
|
return i
|
||||||
|
|
||||||
|
def is_bouncy(n):
|
||||||
|
n = list(str(n))
|
||||||
|
s = sorted(n)
|
||||||
|
return n != s and n[::-1] != s
|
||||||
|
|
||||||
|
print(main(99))
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from math import factorial
|
||||||
|
|
||||||
|
def main(k):
|
||||||
|
n = 10
|
||||||
|
ascend = binomial(n+k-1, k)
|
||||||
|
descnd = sum(binomial(n+i-1, i) for i in range(1,k+1))
|
||||||
|
repeat = n*k + 1 # why 1
|
||||||
|
return ascend + descnd - repeat
|
||||||
|
|
||||||
|
def binomial(n, k):
|
||||||
|
return factorial(n) // (factorial(k)*factorial(n-k))
|
||||||
|
|
||||||
|
#print(main(6))
|
||||||
|
#print(main(10))
|
||||||
|
print(main(100))
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# p -> recursive with lookup table
|
||||||
|
# p2 -> count individual combs, add squares, got from forum
|
||||||
|
|
||||||
|
def p(n, tbl=False):
|
||||||
|
if n < 3:
|
||||||
|
return 1
|
||||||
|
if tbl==False:
|
||||||
|
tbl = []
|
||||||
|
if n-3 >= len(tbl):
|
||||||
|
r = 2*p(n-1, tbl) - p(n-2,tbl) + p(n-4, tbl)
|
||||||
|
tbl.append(r)
|
||||||
|
return tbl[n-3]
|
||||||
|
|
||||||
|
def p2(n):
|
||||||
|
if n < 3:
|
||||||
|
return 1
|
||||||
|
rd = 1
|
||||||
|
b1 = b2 = 0
|
||||||
|
b3 = 1
|
||||||
|
for i in range(3,n):
|
||||||
|
b = b3
|
||||||
|
b3 += b2
|
||||||
|
b2 = b1
|
||||||
|
b1 = rd
|
||||||
|
rd += b
|
||||||
|
return rd+b1+b2+b3
|
||||||
|
|
||||||
|
print(p(50))
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# See 144
|
||||||
|
|
||||||
|
def main(m, bound):
|
||||||
|
n = m
|
||||||
|
tbl = []
|
||||||
|
while p(m, n, tbl) < bound: n += 1
|
||||||
|
return n, p(m, n, tbl)
|
||||||
|
|
||||||
|
def p(m, n, tbl=False):
|
||||||
|
if n < m:
|
||||||
|
return 1
|
||||||
|
if tbl==False:
|
||||||
|
tbl = []
|
||||||
|
if n-m >= len(tbl):
|
||||||
|
r = 2*p(m, n-1, tbl) - p(m, n-2,tbl) + p(m, n-m-1, tbl)
|
||||||
|
tbl.append(r)
|
||||||
|
return tbl[n-m]
|
||||||
|
|
||||||
|
def p2(m, n):
|
||||||
|
#doesnt work why?
|
||||||
|
if n < m:
|
||||||
|
return 1
|
||||||
|
matrix = [1]+[0]*m
|
||||||
|
matrix[-1] = 1
|
||||||
|
for _ in range(3,n):
|
||||||
|
bm = matrix[-1]
|
||||||
|
for i in range(m, 0, -1):
|
||||||
|
matrix[i] = matrix[i-1]
|
||||||
|
matrix[-1] += bm
|
||||||
|
matrix[0] += bm
|
||||||
|
return sum(matrix)
|
||||||
|
|
||||||
|
print(main(50, 10**6)[0])
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Modified 115
|
||||||
|
|
||||||
|
def main(n):
|
||||||
|
return p(2, n) + p(3, n) + p(4, n) - 3
|
||||||
|
|
||||||
|
def p(m, n, tbl=False):
|
||||||
|
if n < m:
|
||||||
|
return 1
|
||||||
|
if tbl==False:
|
||||||
|
tbl = []
|
||||||
|
if n-m >= len(tbl):
|
||||||
|
r = p(m, n-1, tbl) + p(m, n-m, tbl)
|
||||||
|
tbl.append(r)
|
||||||
|
return tbl[n-m]
|
||||||
|
|
||||||
|
print(main(50))
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# See 116
|
||||||
|
|
||||||
|
def p(ms, n, tbl=False):
|
||||||
|
if n < min(ms):
|
||||||
|
return n>=0
|
||||||
|
if tbl==False:
|
||||||
|
tbl = []
|
||||||
|
if n-min(ms) >= len(tbl):
|
||||||
|
r = p(ms, n-1, tbl) + sum(p(ms, n-m, tbl) for m in ms)
|
||||||
|
tbl.append(r)
|
||||||
|
return tbl[n-min(ms)]
|
||||||
|
|
||||||
|
print(p((2,3,4), 50))
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def primes(n):
|
||||||
|
sieve = [True] * n
|
||||||
|
for p in range(2, n):
|
||||||
|
if not sieve[p]:
|
||||||
|
continue
|
||||||
|
for i in range(p**2, n, p):
|
||||||
|
sieve[i] = False
|
||||||
|
return [False]*2 + sieve[2:]
|
||||||
|
|
||||||
|
sieve = primes(10**7)
|
||||||
|
|
||||||
|
def is_prime(n):
|
||||||
|
if n >= 10**7:
|
||||||
|
return heuristic(n)
|
||||||
|
return sieve[n]
|
||||||
|
|
||||||
|
def heuristic(n):
|
||||||
|
for i in range(2, int(n**0.5)+1): #slow and lazy
|
||||||
|
if sieve[i] and n%i==0:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def num(digs = set(range(1,10)), n=0, id=[]):
|
||||||
|
c = 0
|
||||||
|
for d in [i for i in digs if i>n]:
|
||||||
|
c += dig(digs-{d}, d, d, id)
|
||||||
|
return c
|
||||||
|
|
||||||
|
def dig(digs, n, p, id):
|
||||||
|
c = check(p, digs, n, id)
|
||||||
|
for d in digs:
|
||||||
|
c += dig(digs-{d}, n, 10*p + d, id)
|
||||||
|
return c
|
||||||
|
|
||||||
|
def check(p, digs, n, id):
|
||||||
|
if len(digs) > 0 and max(digs) < n:
|
||||||
|
return 0
|
||||||
|
if not is_prime(p):
|
||||||
|
return 0
|
||||||
|
if len(digs) == 0:
|
||||||
|
return 1
|
||||||
|
return num(digs, n, id)
|
||||||
|
|
||||||
|
print(num())
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# quick and dirty solution
|
||||||
|
|
||||||
|
from math import sqrt, log10
|
||||||
|
|
||||||
|
def main(n):
|
||||||
|
a = 2
|
||||||
|
nums = []
|
||||||
|
while len(nums) < n or a < nums[-1]**(1.0/pw):
|
||||||
|
an, pw = check(a, nums*(len(nums)>=n))
|
||||||
|
a += 1
|
||||||
|
if an:
|
||||||
|
nums += an
|
||||||
|
nums = sorted(nums)[:n]
|
||||||
|
return nums[-1]
|
||||||
|
|
||||||
|
def check(a, nums):
|
||||||
|
pw = int((a/9) * (1/log10(a)))
|
||||||
|
pw = 2 if pw<2 else pw
|
||||||
|
n = a**pw
|
||||||
|
r = []
|
||||||
|
while len(str(n)) <= a and (not nums or n < nums[-1]):
|
||||||
|
if digsum(n) == a:
|
||||||
|
r.append(n)
|
||||||
|
n *= a
|
||||||
|
return r, pw
|
||||||
|
|
||||||
|
def digsum(n):
|
||||||
|
return sum(map(int, str(n)))
|
||||||
|
|
||||||
|
#print(main(2))
|
||||||
|
#print(main(10))
|
||||||
|
print(main(30))
|
Loading…
Reference in New Issue