# D - Partition

# Mの約数で、しかもN倍してもMを超えないもののうち、最大のものを探す



N, M = list(map(int, input().split()))



if N == 1:

    print(M)

    exit()



x = M//N



while 1:

    if M % x == 0:

        ans = x

        break

    x -= 1

    

print(ans)
# D - Partition

# Mの約数で、しかもN倍してもMを超えないもののうち、最大のものを探す



N, M = list(map(int, input().split()))



x = min(M//N, int(M**0.5))

ans_list = []



while x > 0:

    if M % x == 0:

        ans_list.append(x)

        if (M//x) * N <= M:

            ans_list.append(M//x)

    x -= 1

    

print((max(ans_list)))
# D - Partition
# Mの約数で、しかもN倍してもMを超えないもののうち、最大のものを探す
N, M = list(map(int, input().split()))
if N == 1:
    print(M)
    exit()
x = M // N
while 1:
    if M % x == 0:
        ans = x
        break
    x -= 1
print(ans)

# D - Partition
# Mの約数で、しかもN倍してもMを超えないもののうち、最大のものを探す
N, M = list(map(int, input().split()))
x = min(M // N, int(M**0.5))
ans_list = []
while x > 0:
    if M % x == 0:
        ans_list.append(x)
        if (M // x) * N <= M:
            ans_list.append(M // x)
    x -= 1
print((max(ans_list)))

-if N == 1: -    print(M) -    exit() -x = M // N -while 1: +x = min(M // N, int(M**0.5)) +ans_list = [] +while x > 0: -        ans = x -        break +        ans_list.append(x) +        if (M // x) * N <= M: +            ans_list.append(M // x) -print(ans) +print((max(ans_list)))