因為一個區間內要滿足 \(A_i=kA_{i-1}\) 才會有 \(A_j \bmod A_i = 0\) 或 \(A_i \bmod A_j = 0\)。
顯然我們只用考慮區間內的數。列舉值域,設 \(f_{i}\) 表示當前選的區間裡最小的數,\(cnt_i\) 表示 \(i\) 的出現個數,則有 \(f_i=\max(f_i,f_{ki}+cnt_i)\)。答案為 \(\max(f_i\times i)\)。
時間複雜度 \(O(V\log V)\)。
點選檢視程式碼
void work() {
m0(cnt);
m0(f);
in1(n);
inn(a,n);
For(i,1,n) cnt[a[i]]++;
int ans=0;
Rep(i,maxn-1,1) {
int x=1;
while(i*x<maxn) {
f[i]=max(f[i],f[i*x]+cnt[i]);
x++;
}
ans=max(ans,f[i]*i);
}
cout<<ans<<'\n';
}