博客
关于我
bzoj 3629: [JLOI2014]聪明的燕姿
阅读量:258 次
发布时间:2019-03-01

本文共 1965 字,大约阅读时间需要 6 分钟。

求所有约数和等于S的数

在这个问题中,我们需要找出所有满足约数和等于给定值S的正整数。为了高效解决这个问题,我们采用了一种基于深度优先搜索(DFS)的方法。这种方法能够快速找到所有符合条件的数。

方法思路

首先,我们需要理解约数和的概念。一个数的约数和是指其所有正约数的和。例如,6的约数有1、2、3、6,约数和为12。我们的目标是找到所有这样的数,使得它们的约数和等于S。

为了实现这一点,我们使用了以下方法:

  • 预处理质数:首先,我们生成一个质数列表,这些质数将用于构造可能的数。
  • 深度优先搜索:通过递归的方法,尝试所有可能的质因数分解,计算每个可能数的约数和。
  • 剪枝优化:为了避免重复计算,我们在搜索过程中使用了一些剪枝技巧,确保每个路径只计算一次。
  • ###代码实现以下是实现该方法的C++代码:

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;#define LL long longint prime[100010], pr = 0;int sqrts, ans[1000010], n;bool v[100010];void pre() { memset(v, true, sizeof(v)); for (int i = 2; i <= 100000; ++i) { if (v[i]) { prime[++pr] = i; for (int j = 1; j <= pr && i * prime[j] <= 100000; ++j) { v[i * prime[j]] = false; if (i % prime[j] == 0) break; } } }}bool isprime(int x) { if (x <= 100000) return v[x]; int tmp = sqrt(x); for (int i = 1; prime[i] <= tmp; ++i) { if (x % prime[i] == 0) return false; } return true;}void cal(int last, int tot, int num) { if (tot == 1) { ans[++n] = num; return; } if (tot - 1 > sqrts && isprime(tot - 1)) { ans[++n] = (tot - 1) * num; } for (int i = last + 1; prime[i] <= sqrts; ++i) { int tmp = 1, t = prime[i]; for (int j = 1; tmp + t <= tot; ++j) { tmp += t; t *= prime[i]; if (tot % tmp == 0) { cal(i, tot / tmp, num * (t / prime[i])); } } }}int main() { int S; pre(); while (scanf("%d", &S) != EOF) { sqrts = sqrt(S); n = 0; cal(0, S, 1); sort(ans + 1, ans + n + 1); for (int i = 1; i <= n; ++i) { cout << ans[i] << endl; } }}

    代码解释

  • 预处理质数:pre()函数用于生成质数列表。我们使用了一个标记数组v,初始时所有位置都被标记为true,表示这些数是合数。然后,我们从2开始遍历,标记出所有质数,并更新质数列表。

  • 检查是否为质数:isprime()函数用于检查一个数是否为质数。对于小于100000的数,直接使用预处理的质数列表;对于大于100000的数,通过试除法检查。

  • 深度优先搜索:cal()函数是递归函数,用于生成所有可能的数。我们从给定的质因数分解开始,逐步构造数,并计算其约数和。如果约数和等于目标值S,则将该数记录下来。

  • 剪枝优化:在递归过程中,如果当前分解路径已经超出目标值,或者当前分解已经超过了预处理的质数范围,我们就停止递归,避免重复计算。

  • 排序和输出:在主函数中,我们对生成的结果进行排序,并按照要求输出结果。

  • 适用场景

    这种方法适用于处理较小的S值,能够快速生成所有约数和等于S的数。对于较大的S值,可能需要进行优化,以减少计算时间。

    转载地址:http://gdza.baihongyu.com/

    你可能感兴趣的文章
    python中很常用的10个内置函数整理(初学必备)
    查看>>
    python中打印二维列表数据
    查看>>
    python中打散数组shuffle
    查看>>
    Python中执行外部命令
    查看>>
    Python中拼接numpy数组-ChatGPT4o作答
    查看>>
    Python中提示:no module named 'PIL'
    查看>>
    Python中提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
    查看>>
    python中数据类型存储_浅谈Python中的数据类型
    查看>>
    python中文件最重要的功能是什么-学 Python 都用来干嘛的?
    查看>>
    python中文版语言_高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?...
    查看>>
    Python中文问题SyntaxError
    查看>>
    Python中方括号和括号括起来的列表有什么区别?
    查看>>
    python中时间处理_Python中处理时间的几种方法小结
    查看>>
    Python中枚举串口(包括虚拟端口)的跨平台方法是什么?
    查看>>
    python中根号下a怎么写_python中根号怎么表示
    查看>>
    Python中正则表达式的巧妙使用
    查看>>
    Python中浮点数的二进制表示(位不是十六进制)
    查看>>
    Python中特殊函数和表达式 filter,map,reduce,lambda
    查看>>
    python中用socket检测端口_Python 用socket模块实现检测端口和检测web服务
    查看>>
    python中用于列表操作的plus和append有什么区别?
    查看>>