using
System;
using
System.Collections.Generic;
class
GFG
{
public
static
void
SieveOfEratosthenes(
int
MAX,
List<
int
> primes)
{
Boolean[] prime =
new
Boolean[MAX + 1];
for
(
int
i = 0; i < MAX + 1; i++)
prime[i] =
true
;
for
(
int
p = 2; p * p <= MAX; p++)
{
if
(prime[p] ==
true
)
{
for
(
int
i = p * p; i <= MAX; i += p)
prime[i] =
false
;
}
}
for
(
int
i = 2; i <= MAX; i++)
{
if
(prime[i])
primes.Add(i);
}
}
public
static
int
findLongest(
int
[] A,
int
n)
{
Dictionary<
int
,
int
> mpp =
new
Dictionary<
int
,
int
>();
List<
int
> primes =
new
List<
int
>();
SieveOfEratosthenes(A[n - 1], primes);
int
[] dp =
new
int
[n];
dp[n - 1] = 1;
mpp.Add(A[n - 1], n - 1);
for
(
int
i = n - 2; i >= 0; i--)
{
int
num = A[i];
dp[i] = 1;
foreach
(
int
it
in
primes)
{
int
xx = num * it;
if
(xx > A[n - 1])
break
;
else
if
(mpp.ContainsKey(xx) && mpp[xx] != 0)
{
dp[i] = Math.Max(dp[i], 1 + dp[mpp[xx]]);
}
}
if
(mpp.ContainsKey(A[i]))
mpp[A[i]] = i;
else
mpp.Add(A[i], i);
}
int
ans = 1;
for
(
int
i = 0; i < n; i++)
ans = Math.Max(ans, dp[i]);
return
ans;
}
public
static
void
Main(String[] args)
{
int
[] a = { 1, 2, 5, 6, 12, 35, 60, 385 };
int
n = a.Length;
Console.WriteLine(findLongest(a, n));
}
}