竞赛
考级
质数ABC 题目分析 题目要求找寻 nnn 以内的 333 个 质数,并按照式子 a2+b+c2<=na ^ 2 + b + c ^ 2 <= na2+b+c2<=n。 那么 a2<=na^2 <= na2<=n,所以 a<=na <= \sqrt{n}a<=n ,也就是说我们只要求 n\sqrt{n}n 以内所有的质数即可,这个用埃氏筛处理一下,所求的质数个数大约是 784997849978499。 然后暴力枚举所有情况就可以了。 AC代码
AC君
a,ba,ba,b 暴力for,然后我们注意到通过 a,ba,ba,b 可以求到 ccc 的范围,二分就行 时间复杂度:O((n3)2logn)O((\sqrt[3] n)^2\log n)O((3n )2logn).
cjdstttttt
LOVEKlee1314
TN Hacker
总结代码的核心逻辑: 本代码采用了三层嵌套循环的结构来遍历所有可能的质数三元组 (a, b, c),并通过数学推导来优化循环的上限,避免了不必要的计算。 1. 外层循环 (a):从最小的质数 2 开始,依次尝试每个质数作为 a。 2. 中层循环 (b):对于每个 a,从比 a 大的下一个质数开始,依次尝试每个质数作为 b。 3. 内层循环 (c):对于每一对 (a, b),计算出 c 的最大可能值 mc = sqrt(n / (a*a*b))。然后从比 b 大的下一个质数开始,依次尝试每个质数作为 c,直到 c 超过 mc。每找到一个符合条件的 c,计数器 cnt 就加一。 4. 剪枝优化: * 在 b 循环内部,如果计算出的 mc 小于等于当前的 b,说明没有比 b 大的 c 能满足条件,此时 b 已经太大,需要 break b 循环,让 a 增加。 * 在 a 循环的开头,会做一个预判。如果当前 a 的平方,即使乘以最小的可能 b 和 c 的平方,结果也已经超过 n,那么说明当前 a 以及所有更大的 a 都不可能找到符合条件的 (b, c) 对,可以直接 break a 循环,程序结束。 这个算法的效率在很大程度上依赖于 next_prime 和 is_prime 函数的效率。对于 n 达到 10^12 的情况,这个算法是可行的,但如果 n 再大很多,可能就需要更高级的质数筛选方法(如埃拉托斯特尼筛法的变体)来预先处理质数,以提高效率。 无注释版:
风之叹
提交答案之后,这里将显示提交结果~