給定 n 個互不相同的正整數,從中選擇若干個數(可重複選擇)構成嚴格遞增序列,要求相鄰兩數不互質(gcd > 1)。求最長序列長度。
import java.util.*;
public class Main {
static final int N = 100005;
static int[] prime = new int[N], primeCnt = {0};
static int[] dp = new int[N]; // dp[質因數] = 最長長度
static int[] a = new int[N];
static List factors = new ArrayList<>();
// 線性篩法預處理質數
static void initPrime() {
boolean[] isComp = new boolean[N];
for (int i = 2; i < N; i++) {
if (!isComp[i]) prime[primeCnt[0]++] = i;
for (int j = 0; j < primeCnt[0] && i * prime[j] < N; j++) {
isComp[i * prime[j]] = true;
if (i % prime[j] == 0) break;
}
}
}
// 分解質因數
static void factorize(int x) {
factors.clear();
for (int i = 0; i < primeCnt[0] && prime[i] * prime[i] <= x; i++) {
if (x % prime[i] == 0) {
factors.add(prime[i]);
while (x % prime[i] == 0) x /= prime[i];
}
}
if (x > 1) factors.add(x);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
initPrime();
int n = in.nextInt();
for (int i = 0; i < n; i++) a[i] = in.nextInt();
Arrays.sort(a, 0, n);
int ans = 1;
for (int i = 0; i < n; i++) {
factorize(a[i]);
int mx = 0;
for (int p : factors) mx = Math.max(mx, dp[p]);
for (int p : factors) dp[p] = mx + 1;
ans = Math.max(ans, mx + 1);
}
System.out.println(ans);
}
}