def dict_create(min_factor, max_factor):
    dict_resulted = {}
    for i in range(min_factor, max_factor + 1):
        for j in range(min_factor, max_factor + 1):
            num, list_of_factors = i * j, sorted([i, j])
            if num not in dict_resulted:
                dict_resulted[num] = [list_of_factors]
            else:
                if list_of_factors not in dict_resulted[num]:
                    dict_resulted[num].append(list_of_factors)
    return dict_resulted
      

def largest(min_factor, max_factor):
    if max_factor < min_factor:
        raise ValueError("min must be <= max")
    dict_operated = dict_create(min_factor, max_factor)
    for num in sorted(dict_operated, reverse = True):
        if str(num) == str(num)[::-1]:
            return tuple([num, dict_operated[num]])


def smallest(min_factor, max_factor):
    if max_factor < min_factor:
        raise ValueError("min must be <= max")
    dict_operated = dict_create(min_factor, max_factor)
    for num in sorted(dict_operated):
        if str(num) == str(num)[::-1]:
            return tuple([num, dict_operated[num]])


print(largest(10, 99))
print()
print(smallest(10, 99))
