#Z01524. 约数个数(DFS-BFS 练手神器)
约数个数(DFS-BFS 练手神器)
题目描述
每年讲解DFS小邹都会让大家做 DFS全排列、DFS数独、DFS整数划分。其实啊,啊哈算法的DFS全排列是带回溯的,个人认为还有更适合DFS入门的。当然不是DFS模拟1-100的累计和。 那么到底是什么呢?那就是DFS实现一个数的约数个数。例如 6 的约数有1 2 3 4,总共4个。这个题目方法很多 1)穷举,从1 到 n依次循环查找并打印 2)根据因子都是对称出现的(12=26),那么确定2是12的约数,那么6也是。这样只需循环从1到sqrt(n)就可以 3)今天要考验大家的就是素因子拆分的方法: 例如:72=22233=(2^3)(3^2),约数个数我们知道就是2的次方个数+1 * 3的次方个数+1=(3+1)(2+1)=43=12个 分别是 1 2 3 4 6 8 9 12 18 24 36 72 为什么约数可以这么简便计算呢?原理就不从纯数学的角度去解释了。大家看如下图的一个搜索状态图:
我们知道72的素因子有3个2,2个3,所以这些素因子的组合其实就是72的所有因子,根据任意正整数的素因子的拆分形式是唯一的,所以这个搜索树也是唯一的。 例如我们从根出发,3个2我们可以选0个2,1个2,2个2,3个2,总计4种选法 一旦2的个数定了,每个节点,我们又可以去拓展3个分支,每个都是0个3,1个3和2个3 小邹要了解下你们对DFS的掌握程度,所以请编程实现,input一个整数n,按小邹搜索树的模式顺序输出n的所有约数,并最后输出约数个数
输入格式
若干组测试数据,每行一个整数n (1<=n<=1200000)
输出格式
按小邹搜索树一次输出n的所有约数,约数之间用空格隔开,最后输入总个数
72
1 3 9 2 6 18 4 12 36 8 24 72 12
豫公网安备41072702000346号