B. Good Sequences
(2s,256M)
Squirrel Liss is interested in sequences. She also has preferences of integers. She thinks
integers
are good.
Now she is interested in good sequences. A sequence is called good if it satisfies the following three conditions:
The sequence is strictly increasing, i.e.
for each
.
No two adjacent elements are coprime, i.e.
for each
(where
denotes the greatest common divisor of the integers
and
).
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
— the number of good integers. The second line contains a single-space separated list of good integers
in strictly increasing order
.
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:
. The length of the longest good sequence is
.
Solution
DP
表示以
结尾的Good Sequence
表示所有含有
这个质因子的
中
每次转移完
之后,再更新一下所有的
即可
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;
}