数字转化
思路:
将每个数字枚举一下,然后找到符合条件的数字,构成一棵树,在树中寻找直径即可
代码:
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 5e4+10;
int sum[N];
vector<int> v[N];
bool st[N];
int ans;
int dfs(int u){
int d1=0,d2= 0;
for(auto i:v[u]){
int d = dfs(i)+1;
if(d >= d1) d2 = d1,d1 =d;
else if(d>d2) d2 =d;
}
ans = max(ans,d1+d2);
return d1;
}
int main() {
int n;
cin>>n;
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++){//必须从2开始,因为1的点会把0(sum【i】)也加进去
if(i>sum[i])
{
v[sum[i]].push_back(i);
st[i] = true;
}}
for(int i = 1;i<=n;i++){
if(!st[i])
dfs(i);
}
cout<<ans;
return 0;
}