夏令营501-511NOIP训练16——数字转换
传送门: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——数字转换的更多相关文章
- test20190731 夏令营NOIP训练16
0+90+0=90.我只挑了T2做. 连接格点 有一个M行N列的点阵,相邻两点可以相连.一条纵向的连线花费一个单位,一条横向的连线花费两个单位.某些点之间已经有连线了,试问至少还需要花费多少个单位才能 ...
- 在 shell 脚本获取 ip、数字转换等网络操作
在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...
- js字符串转换成数字与数字转换成字符串的实现方法
转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...
- js字符串转换成数字,数字转换成字符串
转自网络,忘记出处了. js字符串转换成数字 将字符串转换成数字,得用到parseInt函数. parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseIn ...
- C/C++中字符串与数字转换
本文总结了四种字符串和数字相互转换的方法,方法一和方法二是c++中的方法,方法三和方法四是C语言库函数的方法. 方法一:c++11中string中添加了下面这些方法帮助完成字符串和数字的相互转换 st ...
- js大数字转换,将大额数字转换为万、千万、亿等
代码 /** * 大数字转换,将大额数字转换为万.千万.亿等 * @param value 数字值 */ export function bigNumberTransform (value) { co ...
- numtoyminterval函数——数字转换函数
numtoyminterval函数——数字转换函数 ----转至51CTO 水滴的博客 语法:NUMTOYMINTERVAL ( n , 'char_expr' ) c ...
- 比较java与c语言中数字转换成字符的不同
java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...
- ORACLE数字转换人民币大写
ORACLE 数字转换人民币大写 示例. 数字 :183066999230.68 人民币大写 :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参 ...
随机推荐
- Mysql添加用户和数据库
先创建数据库 创建用户并赋予一个数据库的所有权限 use mysql; create database databaseName character set utf8; grant all privi ...
- SolidWorks新建三维零件
1.创建工作目录. 2.新建一个零件三维模型文件. 3.创建零件中的各个特征 (1).创建第一个特征(基础特征) ①选择命令 ②创建截面草图 定义草图平面 定义截面草图 完成草图 ③定义深度等属性 定 ...
- 谷歌浏览器控制台出现 Unchecked runtime.lastError: The message port closed before a response was received. 的报错
错误截图: 解决:经过网上搜索说是浏览器扩展程序的问题,把那个扩展程序删除或者禁用就可以了
- Android Android Studio 如何导出 Jar 给 Unity 使用
大致步骤如下: 1.创建新的 Android Studio 工程 2.为此 Android Studio 工程创建 Android Library 类库(也就是一个 Module)(后面就是用它生成 ...
- Android SDK Download
{ https://www.androiddevtools.cn/ }
- NX二次开发-将对象移动到图层UF_OBJ_set_layer
#include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <uf_layer.h&g ...
- Linux命令(1):date
查看时间: date "+%Y-%m-%d %H:%M:%S" 参数说明: %n : 下一行 %t : 跳格 %H : 小时(00..23) %I : 小时(01..12) %k ...
- [JZOJ 5814] 树
题目:从u到v经过多少条边. 思路: 考虑他是怎么走的?? 从\(u\)到\(v\)一定是\(fa[u]\),\(fa[fa[u]]\),反正就是走\(LCA\),那么如果算出每个点到父亲的期望步数, ...
- Core Text 入门
本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...
- 移动端多选插件-jquery
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...