from functools import reduce
from tools import number_theory

g_prime = list(number_theory.make_prime(1000000))

def find_a_factor(num, prime):
    while prime:
        p = prime.pop(0)
        if not (num % p):
            return p, prime
    return 0, []

def factor_num(num):
    global g_prime
    for i, value in enumerate(g_prime):
        if value ** 2 > num:
            break
    prime = g_prime[:i]

    factors = {}
    while True:
        factor, prime = find_a_factor(num, prime)
        if factor:
            count = 0
            while not (num % factor):
                num //= factor
                count += 1
            factors[factor] = count
        else:
            if 1 != num:
                factors[num] = 1
            return factors

def tri_num():
    x = 2
    while True:
        yield x * (x + 1) // 2
        x += 1

for x in tri_num():
    factor_count = reduce(lambda x, y: x * (y + 1), factor_num(x).values(), 1)
    if factor_count > 500:
        print(x)
        break