题解:
对于每个数x枚举因子i,记录上一个能整除i的位置,从这个位置转移过来,取max即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,L,dp[50004],nxt[1000004],ans=0;
inline int read() {
int x=0;char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x;
}
int main() {
n=read(),L=read();
for (register int i=1;i<=n;++i) {
int x=read();
for (int j=1;j*j<=x;++j) {
if (x%j) continue;
if (j>=L) dp[i]=max(dp[i],dp[nxt[j]]+1),nxt[j]=i;
int k=x/j;
if (k>=L&&j^k) dp[i]=max(dp[i],dp[nxt[k]]+1),nxt[k]=i;
}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}