B. Good Sequences
(2s,256M)
Squirrel Liss is interested in sequences. She also has preferences of integers. She thinks
n
n
n integers
a
1
,
a
2
,
.
.
.
,
a
n
a_1, a_2, ..., a_n
a1, a2, ..., an are good.
Now she is interested in good sequences. A sequence x 1 , x 2 , . . . , x k x_1, x_2, ..., x_k x1, x2, ..., xk is called good if it satisfies the following three conditions:
The sequence is strictly increasing, i.e.
x
i
<
x
i
+
1
x_i < x_i + 1
xi < xi + 1 for each
i
(
1
≤
i
≤
k
−
1
)
i (1 ≤ i ≤ k - 1)
i(1 ≤ i ≤ k − 1).
No two adjacent elements are coprime, i.e.
g
c
d
(
x
i
,
x
i
+
1
)
>
1
gcd(x_i, x_{i + 1}) > 1
gcd(xi, xi + 1) > 1 for each
i
(
1
≤
i
≤
k
−
1
)
i (1 ≤ i ≤ k - 1)
i(1 ≤ i ≤ k − 1) (where
g
c
d
(
p
,
q
)
gcd(p, q)
gcd(p, q) denotes the greatest common divisor of the integers
p
p
p and
q
q
q).
All elements of the sequence are good integers.
Find the length of the longest good sequence.
Input
The input consists of two lines. The first line contains a single integer
n
(
1
≤
n
≤
1
0
5
)
n (1 ≤ n ≤ 10^5)
n(1 ≤ n ≤ 105) — the number of good integers. The second line contains a single-space separated list of good integers
a
1
,
a
2
,
.
.
.
,
a
n
a_1, a_2, ..., a_n
a1, a2, ..., an in strictly increasing order
(
1
≤
a
i
≤
1
0
5
;
a
i
<
a
i
+
1
)
(1 ≤ a_i ≤ 10^5; a_i < a_{i + 1})
(1 ≤ ai ≤ 105;ai < ai + 1).
Output
Print a single integer — the length of the longest good sequence.
Examples
input
5
2 3 4 6 9
output
4
input
9
1 2 3 5 6 7 8 9 10
output
4
Note
In the first example, the following sequences are examples of good sequences:
[
2
;
4
;
6
;
9
]
,
[
2
;
4
;
6
]
,
[
3
;
9
]
,
[
6
]
[2; 4; 6; 9], [2; 4; 6], [3; 9], [6]
[2;4;6;9],[2;4;6],[3;9],[6]. The length of the longest good sequence is
4
4
4.
Solution
DP
d
p
[
i
]
dp[i]
dp[i]表示以
i
i
i结尾的Good Sequence
d
[
i
]
d[i]
d[i]表示所有含有
i
i
i这个质因子的
x
x
x中
m
a
x
(
d
p
[
x
]
)
max(dp[x])
max(dp[x])
每次转移完
d
p
[
x
]
dp[x]
dp[x]之后,再更新一下所有的
d
[
i
]
d[i]
d[i]即可
Code
#include <cstdio>
#include <algorithm>
#define N 100010
using namespace std;
int a[N], dp[N], d[N];
int gcd(int x, int y) {
if (y == 0) return x;
else return(y, x % y);
}
int main() {
int n;
scanf("%d", &n);
if (n == 1) {
printf("%d\n", 1);
return 0;
}
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
int e = a[i];
for (int j = 2; j * j <= a[i]; ++j) {
if (e % j == 0) {
dp[a[i]] = max(dp[a[i]], d[j]);
while (e % j == 0) e /= j;
}
}
if (e > 1) dp[a[i]] = max(dp[a[i]], d[e]);
dp[a[i]]++;
ans = max(ans, dp[a[i]]);
e = a[i];
for (int j = 2; j * j <= a[i]; ++j) {
if (e % j == 0) {
d[j] = dp[a[i]];
while (e % j == 0) e /= j;
}
}
if (e > 1) d[e] = dp[a[i]];
}
printf("%d\n", ans);
return 0;
}