数论常用技巧:求倍数比求约数简单。
```cpp
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int d1[N],d2[N],st[N];
int h[N],e[N],ne[N],idx;
int ans=0;
int sum[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int x)
{
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
dfs(j);
if(d1[j]+1>=d1[x])
{
d2[x]=d1[x];d1[x]=d1[j]+1;
}
else if(d1[j]+1>d2[x])
{
d2[x]=d1[j]+1;
}
}
ans=max(ans,d2[x]+d1[x]);
}
int main()
{
int n;
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n/i;j++)
{
sum[i*j]+=i;
}
}
for(int i=2;i<=n;i++)
{
if(sum[i]<i)
{
add(sum[i],i);
}
}
for(int i=1;i<=n;i++)
{
if(!st[i])
dfs(i);
}
cout<<ans<<endl;
return 0;
}