using
System;
using
System.Collections.Generic;
class
GFG
{
static
readonly
int
MAX = 10000;
static
List<
int
>[] divisors =
new
List<
int
>[MAX + 1];
static
void
computeDivisors()
{
for
(
int
i = 1; i <= MAX; i++)
{
for
(
int
j = i; j <= MAX; j += i)
{
divisors[j].Add(i);
}
}
}
static
int
getClosest(
int
val1,
int
val2,
int
target)
{
if
(target - val1 >= val2 - target)
return
val2;
else
return
val1;
}
static
int
findClosest(List<
int
> array,
int
n,
int
target)
{
int
[]arr = array.ToArray();
if
(target <= arr[0])
return
arr[0];
if
(target >= arr[n - 1])
return
arr[n - 1];
int
i = 0, j = n, mid = 0;
while
(i < j)
{
mid = (i + j) / 2;
if
(arr[mid] == target)
return
arr[mid];
if
(target < arr[mid])
{
if
(mid > 0 && target > arr[mid - 1])
return
getClosest(arr[mid - 1], arr[mid],
target);
j = mid;
}
else
{
if
(mid < n - 1 && target < arr[mid + 1])
return
getClosest(arr[mid], arr[mid + 1],
target);
i = mid + 1;
}
}
return
arr[mid];
}
static
void
printClosest(
int
N,
int
X)
{
computeDivisors();
int
ans
= findClosest(divisors[N], divisors[N].Count, X);
Console.Write(ans);
}
public
static
void
Main(String[] args)
{
int
N = 16, X = 5;
for
(
int
i = 0; i < divisors.Length; i++)
divisors[i] =
new
List<
int
>();
printClosest(N, X);
}
}