数字转换,只能得70分,且会超时
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 5e5+10;
int sum[N];
bool st[N];
int ans = 0;
int e[N],ne[N],h[N],idx=0;
void add(int a,int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
typedef pair<int, int> PII;
int st2[N];
PII bfs(int u)
{
queue<int> q;
q.push(u);
memset(st2, 0, sizeof st2);
int cnt = 0;
int v;
while(!q.empty())
{
int size = q.size();
while(size--)
{
int cur = q.front();
q.pop();
v = cur;
for(int i = h[cur] ; i != -1 ; i = ne[i])
{
int j = e[i];
if(st2[j])continue;
q.push(j);
st2[j] = true;
}
}
cnt++;
}
return {cnt,v};
}
int main()
{
// 线性筛法
int n; // 求 1-n中的所有prime
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(i > sum[i])
{
// add(i,sum[i]);
add(sum[i],i);
add(i,sum[i]);
st[i] = true;
// st[sum[i]] = true;
}
}
for (int i = 1; i <= n; i ++ )
{
if(!st[i])
{
// dfs(i);
PII v = bfs(i);
ans = max(bfs(v.second).first,ans);
}
}
cout << ans - 1 << endl;
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e5+10;
int sum[N];
bool st[N];
int ans = 0;
int e[N],ne[N],h[N],idx=0;
void add(int a,int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int dfs(int u)
{
int d1 = 0,d2 = 0;
for(int i = h[u] ; i != -1 ; i = ne[i])
{
int j = e[i];
int d = dfs(j) + 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;
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(i > sum[i])
{
// add(i,sum[i]);
add(sum[i],i);
st[i] = true;
// st[sum[i]] = true;
}
}
for (int i = 1; i <= n; i ++ )
{
if(!st[i])
{
dfs(i);
}
}
cout << ans << endl;
return 0;
}