传送门:QAQQAQ

题意:如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。

思路:YY一下,若$x$可以变为$y$,则$y$也一定能变为$x$,所以我们对于可以互相变换的点建一条无向边,因为每一个点最多之和一个值比它小的点连边,所以不可能出现环(这点可以人工YY证明)

所以我们在这个无环“森林”中跑一个最长链即可

代码:(其实以1为根跑直径不够严谨,用DP算最长链更好)

#include<bits/stdc++.h>
using namespace std; vector<int> v[];
int d[]; void dfs(int u,int f,int depth)
{
d[u]=depth;
for(int i=;i<(int)v[u].size();i++)
{
if(v[u][i]==f) continue;
dfs(v[u][i],u,depth+);
}
} void init(int n)
{
for(int i=;i<=n;i++)
{
int sum=;
for(int j=;j*j<=i;j++)
{
if(i%j==)
{
sum+=j;
if(j*j!=i&&j!=) sum+=i/j;
}
}
if(sum<i)
{
v[sum].push_back(i);
v[i].push_back(sum);
}
}
// for(int i=1;i<=n;i++)
// {
// cout<<i<<":";
// for(int j=0;j<v[i].size();j++) cout<<v[i][j]<<" ";
// cout<<endl;
// }
} int main()
{
int n; cin>>n;
init(n);
dfs(,-,);
int s=-,maxn=-;
for(int i=;i<=n;i++)
{
if(maxn<d[i])
{
maxn=d[i];
s=i;
}
}
dfs(s,-,);
for(int i=;i<=n;i++)
{
if(maxn<d[i]) maxn=d[i];
}
cout<<maxn<<endl;
return ;
}

夏令营501-511NOIP训练16——数字转换的更多相关文章

  1. test20190731 夏令营NOIP训练16

    0+90+0=90.我只挑了T2做. 连接格点 有一个M行N列的点阵,相邻两点可以相连.一条纵向的连线花费一个单位,一条横向的连线花费两个单位.某些点之间已经有连线了,试问至少还需要花费多少个单位才能 ...

  2. 在 shell 脚本获取 ip、数字转换等网络操作

    在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...

  3. js字符串转换成数字与数字转换成字符串的实现方法

    转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...

  4. js字符串转换成数字,数字转换成字符串

    转自网络,忘记出处了. js字符串转换成数字 将字符串转换成数字,得用到parseInt函数. parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseIn ...

  5. C/C++中字符串与数字转换

    本文总结了四种字符串和数字相互转换的方法,方法一和方法二是c++中的方法,方法三和方法四是C语言库函数的方法. 方法一:c++11中string中添加了下面这些方法帮助完成字符串和数字的相互转换 st ...

  6. js大数字转换,将大额数字转换为万、千万、亿等

    代码 /** * 大数字转换,将大额数字转换为万.千万.亿等 * @param value 数字值 */ export function bigNumberTransform (value) { co ...

  7. numtoyminterval函数——数字转换函数

      numtoyminterval函数——数字转换函数 ----转至51CTO 水滴的博客  语法:NUMTOYMINTERVAL ( n , 'char_expr' )              c ...

  8. 比较java与c语言中数字转换成字符的不同

    java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...

  9. ORACLE数字转换人民币大写

    ORACLE 数字转换人民币大写     示例.   数字                    :183066999230.68 人民币大写        :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参 ...

随机推荐

  1. CSIC_716_20191129【 单例模式 的五种实现方式】

     单例模式 单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况.  让所有通过该类实例化出的对象,都指向同一个内存地址. 优点:节省内存空间. 单例模式有五种表现形式: 1.通过class ...

  2. leetcode -有效的字母异位词 python&C++

    C++解题代码: class Solutiion { public: bool isAnagram(string s, string t) { ](); int n = s.length(); int ...

  3. leetcood学习笔记-169-求众数

    题目描述: 方法一:排序输出中位数 class Solution(object): def majorityElement(self, nums): """ :type ...

  4. delphi xe10 蓝牙

    //蓝牙 System.Bluetooth //单元中主要包含以下几个类 TBluetoothManager.TBluetoothDeviceList.TBluetoothAdapter.TBluet ...

  5. Java——单例模式初步

    1.7 单例模式初步 好书推荐:java与模式 1.7.1 什么是设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋 ...

  6. 基本算数定理快速求约数个数——lightoj1208

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1000005 bool vi ...

  7. NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> #include <u ...

  8. 进程、线程、协程、CPU

    进程.线程.CPU 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 ...

  9. (转)JAVA国际化

    转:http://www.cnblogs.com/jjtech/archive/2011/02/14/1954291.html 国际化英文单词为:Internationalization,又称I18N ...

  10. [转]C# JSON格式的字符串读取到类中

    将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using Syste ...