def fund(n): lower, upper = bounds(n) p = 0 for b in range(lower, upper+1): r = n - b for seq in mtools.comb(range(1,n+1), r): a = mtools.mul(seq) p += a return mtools.fac(n+1)/p
def get_n(l): l2 = [primes[i]**x for (i, x) in enumerate(l)] return mtools.mul(l2)
def search(l, (m, n)): states = [l] visited = {} nm = 0 dm = em = 1 while True: s = states.pop(0) h = hashable(s) try: if visited[h]: continue except KeyError: visited[h] = True ps = [primes[i] for i in range(len(s))] pm = mtools.mul(ps) pm1 = mtools.mul([p-1 for p in ps]) d = get_n(s) e1, d1 = normalize(d*pm1, (d-1)*pm) if e1*n < d1*m: return d if e1*dm < d1*em: em = e1 dm = d1 nm = d elif d > nm: continue states += expand_states(s) states.sort(cmp = lambda x,y: cmp(get_n(x), get_n(y))) def normalize(e, d):
def f(l): l2 = [2*x+1 for x in l] return (mtools.mul(l2)+1)/2