数字转换
(资料图片仅供参考)
题目描述
如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y也可以变成 x。例如,4 可以变为 3,1 可以变为 7。限定所有数字变换在不超过 n 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。
输入格式
输入一个正整数 n。
输出格式
输出不断进行数字变换且不出现重复数字的最多变换步数。
数据范围
1≤n≤50000
输入样例
7输出样例
3样例解释
一种方案为:4→3→1→7。
题目分析
代码实现
#include#include#includeusing namespace std;#define int long longconst int N=5e4+5,M=2*N;int h[N],e[M],ne[M],idx;int sum[N],vis[N],ans;void add(int x,int y){e[idx]=y,ne[idx]=h[x],h[x]=idx++;}int dfs(int u,int f){ //标记该结点已被访问vis[u]=1;int dist=0,d1=0,d2=0;for(int i=h[u];~i;i=ne[i]){int j=e[i];//防止回头if(j==f)continue;//求当前结点向下的路径int dis=dfs(j,u)+1;//更新该结点向下的最长路径dist=max(dist,dis);//更新最长路径和次长路径if(dis>d1)d2=d1,d1=dis;else if(dis>d2)d2=dis;}//答案即为每个结点的最长路径和次长路径之和的最大值ans=max(ans,d1+d2);return dist;}signed main(){int n;cin>>n;memset(h,-1,sizeof h);//遍历一下,将i*j的约数和算出来for(int i=1;i<=n/2;i++){for(int j=2;j<=n/i;j++)sum[i*j]+=i;}//如果约数之和比本身小,则建立无向边for(int i=2;i<=n;i++){if(sum[i] 下一篇:最后一页
X 关闭
-

商家花10万请人直播带货 结果3个月卖了不到700元
随着电商直播领域的发展,直播带货已经逐渐进入各个行业,成为新的营销方式,门槛低、投入小,拿起手机就能直播带货吸引了无数商家加入其中
-

女子被同事拥抱致2根肋骨骨折 为何如此严重?专业人士科普
这可能就是另一种意义上的生命中不能承受之重?据白鹿视频,近日在湖南岳阳,曹姓女孩工作时来到同事黄某工作的机器前,在交谈后临走时,被
-

“大春不足小春补” 小春作物为农户打开增收新路
近年来,受全国市场供过于求的影响,宾川县拉乌乡大春传统支柱产业核桃产业颓势明显。拉乌乡党委、乡政府积极思变,理清发展思路,树立大春
-

一墒墒蔬菜长势喜人 村民“钱袋子”鼓起来了
三月的文山壮族苗族自治州广南县那洒镇贵马村,山清水秀,春意盎然。走进贵马村河畔1000亩连片农田,一墒墒蔬菜长势喜人,村民们正忙着采收

