#!/usr/bin/python3
# -*- coding: utf-8 -*-
# †
from collections import namedtuple
from heapq import heappush, heappop
Tup = namedtuple('Tup', 'cnt, num')

def sieve(N):
    is_prime = [False, False] + [True] * (N-1)
    sq = int(N ** .5)
    for i in range(2, sq+1):
        if is_prime[i]:
            for j in range(i*i, N+1, i):
                is_prime[j] = False
    return [i for i, p in enumerate(is_prime) if p]

primes = sieve(50)
N = len(primes)
LIMIT = 10**18

pq = []
cnt = 1
x = 1
# 約数の個数、値そのもの、i番目の素数を、icnt個使う
heappush(pq, (cnt, x, 0, 0))
max_cnt = cnt
resArr = []
while len(pq):
    cnt, x, i, icnt = heappop(pq)
    if max_cnt < cnt:
        resArr.append(Tup(cnt, x))
        max_cnt = cnt
    if x * primes[i] < LIMIT:
        # i 番目を icnt 個から 1 個増やして icnt+1 個にする
        heappush(pq, (cnt*(icnt+2)//(icnt+1), x*primes[i], i, icnt+1))
    if i + 1 < N and x * primes[i+1] < LIMIT:
        # i+1 番目を新たに 1 個使う
        heappush(pq, (cnt*2, x*primes[i+1], i+1, 1))

# 値で昇順になるように情報をオミットして出力する。
resArr.sort(key=lambda tup: tup.num)
max_cnt = 0
for cnt, num in resArr:
    if max_cnt < cnt:
        max_cnt = cnt
        # 約数の個数, 値
        print(cnt, num)
