不大难的dp,暴力拆一下约数然后按照约数来统计即可.
注意:vector 很慢,所以一定特判一下,如果没有该数,就不要添加.
Code:
#include <bits/stdc++.h>
#define N 1000005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
vector<int>v[N];
int prime[N],f[N],g[N],A[N];
bool vis[N],go[N];
int main()
{
// setIO("input");
int n,L,i,j,tot=0,M=0;
scanf("%d%d",&n,&L);
for(i=1;i<=n;++i) scanf("%d",&A[i]), go[A[i]]=1;
for(i=2;i<N;++i)
{
if(!vis[i]) prime[++tot]=i;
for(j=1;j<=tot&&prime[j]*i<N;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(i=L;i<N;++i) for(j=i;j<N;j+=i) if(go[j])v[j].push_back(i);
for(i=1;i<=n;++i)
{
int c=A[i],mx=0;
for(j=0;j<v[c].size();++j)
{
int cur=v[c][j];
++g[cur];
mx=max(mx, g[cur]);
}
for(j=0;j<v[c].size();++j)
{
int cur=v[c][j];
g[cur]=mx;
}
M=max(M,mx);
}
printf("%d\n",M);
return 0;
}