using
System;
using
System.Collections.Generic;
class
GFG{
static
Dictionary<Tuple<
int
,
int
>,
int
> dp =
new
Dictionary<Tuple<
int
,
int
>,
int
>();
static
int
maxgcd, N;
static
List<
int
> arr;
static
List<
int
> arr1;
static
int
__gcd(
int
a,
int
b)
{
if
(b == 0)
return
a;
return
__gcd(b, a % b);
}
static
int
findMaxGCD(List<
int
> arr,
int
N)
{
int
high = 0;
for
(
int
i = 0; i < N; i++)
high = Math.Max(high, arr[i]);
int
[] count =
new
int
[high + 1];
for
(
int
i = 0; i < N; i++)
count[arr[i]] += 1;
int
counter = 0;
for
(
int
i = high; i > 0; i--)
{
int
j = i;
while
(j <= high)
{
if
(count[j] > 0)
counter += count[j];
j += i;
if
(counter == 2)
return
i;
}
counter = 0;
}
return
1;
}
static
int
maxlen(
int
i,
int
j)
{
if
(i >= N || j >= N)
return
0;
if
(dp.ContainsKey(
new
Tuple<
int
,
int
>(i, j)))
return
dp[
new
Tuple<
int
,
int
>(i, j)];
if
(__gcd(arr[i], arr1[j]) ==
maxgcd && arr[i] != arr1[j])
{
dp[
new
Tuple<
int
,
int
>(i, j)] = 1 + maxlen(
i, j + 1);
return
dp[
new
Tuple<
int
,
int
>(i, j)];
}
return
(Math.Max(maxlen(i + 1, j),
maxlen(i, j + 1)));
}
static
void
Main()
{
arr =
new
List<
int
>(
new
int
[]{ 1, 2, 8, 5, 6 });
arr1 = arr;
arr1.Sort();
N = arr.Count;
maxgcd = findMaxGCD(arr, N);
Console.Write(maxlen(0, 0) + 1);
}
}