using
System;
class
GFG
{
static
int
gcd(
int
a,
int
b)
{
if
(a == 0)
return
b;
if
(b == 0)
return
a;
if
(a == b)
return
a;
if
(a > b)
return
gcd(a-b, b);
return
gcd(a, b-a);
}
static
int
findGCD(
int
x,
int
y,
int
z,
int
res)
{
int
ans = gcd(x, res);
ans = Math.Max(ans, gcd(y, res));
ans = Math.Max(ans, gcd(z, res));
return
ans;
}
static
int
maximumGCD(
int
[] A,
int
N,
int
K)
{
int
[,] dp =
new
int
[N, 3];
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 1; j < 3; j++) {
dp[i, j] = 0;
}
}
dp[0, 0] = A[0];
dp[0, 1] = A[0] + K;
dp[0, 2] = A[0] - K;
for
(
int
i = 1; i < N; i++) {
int
x = dp[i - 1, 0];
int
y = dp[i - 1, 1];
int
z = dp[i - 1, 2];
dp[i, 0] = findGCD(x, y, z, A[i]);
dp[i, 1] = findGCD(x, y, z, A[i] + K);
dp[i, 2] = findGCD(x, y, z, A[i] - K);
}
int
mx = Math.Max(3, Math.Max(dp[N - 1, 0], Math.Max(dp[N - 1, 1],
dp[N - 1, 2])));
return
mx;
}
public
static
void
Main()
{
int
[] arr = { 3, 9, 15, 24 };
int
K = 1;
int
N = arr.Length;
Console.Write( maximumGCD(arr, N, K));
}
}