https://www.51nod.com/Challenge/Problem.html#!#problemId=1524
题意可以转换为 用给定的几个数构成一个哈斯图 求最长链
类似素数筛地跑一遍 复杂度n*logn
下面两种写法 大同小异 都要加读入优化才能过
using namespace std;
const int maxn=1e6+10;
int prime[maxn],book[maxn],ary[maxn],cnt[maxn],maxx[maxn];
int num,n,lim,len;
template <class T>
inline void _cin(T &ret)
{
char c;
ret = 0;
while((c = getchar()) < '0' || c > '9');
while(c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0');
c = getchar();
}
}
void init()
{
int i,j;
book[1]=1;
for(i=2;i<=lim;i++){
if(!book[i]){
for(j=i+i;j<=lim;j+=i){
book[j]=1;
}
prime[++num]=i;
}
}
}
int main()
{
int i,j,ans;
//scanf("%d",&n);
_cin(n);
for(i=1;i<=n;i++){
//scanf("%d",&ary[i]);
_cin(ary[i]);
lim=max(lim,ary[i]);
}
init();
sort(ary+1,ary+n+1);
ans=0;
for(i=1;i<=n;i++){
if(len==0||ary[len]!=ary[i]){
ary[++len]=ary[i];
}
cnt[ary[len]]++;
maxx[ary[len]]++;
ans=max(ans,cnt[ary[len]]);
}
for(i=1;i<=lim;i++){
for(j=1;j<=num&&i*prime[j]<=lim;j++){
maxx[i*prime[j]]=max(maxx[i*prime[j]],maxx[i]+cnt[i*prime[j]]);
}
}
for(i=1;i<=len;i++){
ans=max(ans,maxx[ary[i]]);
}
printf("%d\n",ans);
return 0;
}
using namespace std;
const int maxn=1e6+10;
int ary[maxn],cnt[maxn],maxx[maxn],book[maxn];
int n,len;
template <class T>
inline void _cin(T &ret)
{
char c;
ret = 0;
while((c = getchar()) < '0' || c > '9');
while(c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0');
c = getchar();
}
}
int main()
{
int i,j,ans;
//scanf("%d",&n);
_cin(n);
for(i=1;i<=n;i++){
//scanf("%d",&ary[i]);
_cin(ary[i]);
}
sort(ary+1,ary+n+1);
ans=0;
for(i=1;i<=n;i++){
if(len==0||ary[len]!=ary[i]){
ary[++len]=ary[i];
book[ary[len]]=1;
}
cnt[ary[len]]++;
maxx[ary[len]]++;
ans=max(ans,cnt[ary[len]]);
}
for(i=1;i<=len;i++){
for(j=2*ary[i];j<=1e6;j+=ary[i]){
if(book[j]){
maxx[j]=max(maxx[j],maxx[ary[i]]+cnt[j]);
ans=max(ans,maxx[j]);
}
}
}
printf("%d\n",ans);
return 0;
}