CodeForces 264B.Good Sequences(DP)

版权声明:蒟蒻的博文,dalao转载标明出处就好吖 https://blog.csdn.net/jokingcoder/article/details/82146065

B. Good Sequences

(2s,256M)
Squirrel Liss is interested in sequences. She also has preferences of integers. She thinks n integers a 1 , a 2 , . . . , a n are good.

Now she is interested in good sequences. A sequence x 1 , x 2 , . . . , x k is called good if it satisfies the following three conditions:

The sequence is strictly increasing, i.e. x i < x i + 1 for each i ( 1 i k 1 ) .
No two adjacent elements are coprime, i.e. g c d ( x i , x i + 1 ) > 1 for each i ( 1 i k 1 ) (where g c d ( p , q ) denotes the greatest common divisor of the integers p and 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 10 5 ) — the number of good integers. The second line contains a single-space separated list of good integers a 1 , a 2 , . . . , a n in strictly increasing order ( 1 a i 10 5 ; a i < a i + 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

扫描二维码关注公众号,回复: 2971516 查看本文章

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 ] . The length of the longest good sequence is 4 .

Solution

DP
d p [ i ] 表示以 i 结尾的Good Sequence
d [ i ] 表示所有含有 i 这个质因子的 x m a x ( d p [ x ] )
每次转移完 d p [ x ] 之后,再更新一下所有的 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;
}

猜你喜欢

转载自blog.csdn.net/jokingcoder/article/details/82146065
今日推荐