def main(verbose=False): primes = sieve(100) MAX_n = 10 ** 16 product_factor_pairs = [(1, 0)] product_hash = {0: [1]} for num_factors in range(1, 13 + 1): product_hash[num_factors] = [] # (1,0) becomes # (1,0), (p, 1) becomes # (1,0), (p, 1), (q,1), (q*p, 2) etc. for prime in primes: to_add = [] for product, num_factors in product_factor_pairs: if prime * product < MAX_n: to_add.append((prime * product, num_factors + 1)) product_hash[num_factors + 1].append(prime * product) product_factor_pairs += to_add result = 0 sign = -1 for num_factors in range(4, 13 + 1): sign = -sign PIE_factor = sign * choose(num_factors - 1, 3) current_sum = 0 for product in product_hash[num_factors]: current_sum += MAX_n / product # integer division result += PIE_factor * current_sum return result
def main(verbose=False): expected_hash = {0: 0} for n in range(1, 32 + 1): to_add = 2 ** n for k in range(1, n + 1): to_add += choose(n, k) * expected_hash[n - k] expected_hash[n] = (to_add * 1.0) / (2 ** n - 1) return round(expected_hash[32], 10)
def main(verbose=False): n = 100 return choose(n + 10, 10) + choose(n + 9, 9) - 10 * n - 2
def main(verbose=False): # In an n x m grid there are (n + m) C m = (n + m) C n such paths. return choose(20 + 20, 20)