检查一个数字是否可以表示为两个立方之和的高效程序

2024-04-30

我正在尝试编写一个程序来检查数字 N 是否可以表示为两个立方之和,即 N = a^3 + b^3

这是我的代码,复杂度为 O(n):

#include <iostream>
#include<math.h>
#define ll unsigned long long
using namespace std;

int main()
{
 ios_base::sync_with_stdio(false);
 bool flag=false;
 ll t,N;
 cin>>t;
 while(t--)
 {
     cin>>N;
     flag=false;
     for(int i=1; i<=(ll)cbrtl(N/2); i++)
     {
       if(!(cbrtl(N-i*i*i)-(ll)cbrtl(N-i*i*i))) {flag=true; break;}
     }
     if(flag) cout<<"Yes\n"; else cout<<"No\n";
 }
 return 0;
}

由于代码的时间限制是2秒,这个程序给出了TLE?谁能建议一个更快的方法


我也在 StackExchange 中发布了这个,如果您认为重复,很抱歉,但我真的不知道这些是相同还是不同的板(交换和溢出)。我的个人资料在这里显得不同。

=========================

有一种更快的算法来检查给定的整数是否是两个立方体 n=a^3+b^3 的和(或差)

我不知道这个算法是否已知(可能是,但我在书籍或互联网上找不到它)。我发现并用它来计算整数,直到 n

这个过程使用了一个技巧

4(a^3+b^3)/(a+b) = (a+b)^2 + 3(a-b)^2)

我们事先不知道“a”和“b”是什么,所以“(a+b)”也是什么,但我们知道“(a+b)”肯定应该整除 (a^3+ b^3) ,因此如果您有一个快速素数分解例程,您可以快速计算 (a^3+b^3) 的每个除数,然后检查是否

(4(a^3+b^3)/除数 - 除数^2)/3 = 平方

当(并且如果)找到一个正方形时,您有 divisor=(a+b) 和 sqrt(square)=(a-b) ,因此您有 a 和 b。

如果没有找到平方,则该数字不是两个立方之和。

我们知道除数

现在与其他算法进行一些比较 - 对于 n = 10^18,通过使用暴力,您应该测试所有低于 10^6 的数字才能知道答案。另一方面,要构建 10^18 的所有约数,您需要素数直到 10^9。

10^9 中可以容纳的不同素数的最大数量是 10 (2*3*5*7*11*13*17*19*23*29 = 5*10^9),所以我们有 2^10-1在最坏的情况下检查素数的不同组合(组合除数),其中许多由于限制而被丢弃。

为了计算素数因子,我使用了一个包含前 60.000.000 个素数的表,该表在此范围内效果很好。

米格尔·贝利利亚

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查一个数字是否可以表示为两个立方之和的高效程序 的相关文章

  • 具有非常大的数字的除法

    我只是想知道在处理大数字时有哪些不同的除法策略 我所说的大数字是指 50 位数字 例如 9237639100273856744937827364095876289200667937278 82637448262718273966299344
  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • 数学 - 映射数字

    如何将 a 和 b 之间的数字线性映射到 c 和 d 之间 也就是说 我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字 但我需要广义的情况 我的脑子炸了 如果您的数字 X 位于 A 和 B 之间 并且您希望 Y 位于 C 和
  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 比较批处理文件中的两个数字

    我在这个网站上搜索了我的问题 但没有找到解决我问题的方法 系统为玩家和计算机提供一个从 2 到 12 的随机数 这有 3 部分 X 大于 Y 如果 X 小于 Y 以及当 X 与 Y 相同 当我开始 bat 效果很好 我选择Play Game
  • 在 Blackberry 4.2 JDE 上调用 atan 函数

    我需要从我的 Blackberry Java 应用程序计算反正切值 不幸的是 blackberry 4 2 api 没有 Math atan 函数 Blackberry JDE 4 6 版有此功能 但 4 2 版没有 有谁知道计算 atan
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 列出所有 k 元组,其条目总和为 n,忽略旋转

    有没有一种有效的算法来查找所有序列k总和为的非负整数n 同时避免旋转 如果可能的话 完全避免 顺序很重要 但对于我正在解决的问题来说 轮换是多余的 例如 与k 3 和n 3 我想要得到一个如下所示的列表 3 0 0 2 1 0 2 0 1
  • 批处理文件中是否存在“Power to”功能? (指数)

    Problem 有没有办法将变量 乘以 数字或其他变量的批处理文件 有这个功能吗 Python 中的一个示例是您可以使用 为 到 的力量 EDIT 您可以在批处理文件中进行数学运算 http en wikipedia org wiki Ba
  • 如何在Python的SciPy中更改稀疏矩阵中的元素?

    我构建了一个小代码 我想用它来解决涉及大型稀疏矩阵的特征值问题 它工作正常 我现在要做的就是将稀疏矩阵中的一些元素设置为零 即最顶行中的元素 对应于实现边界条件 我可以调整下面的列向量 C0 C1 和 C2 来实现这一点 不过我想知道是否有
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • 旋转矩阵openCV

    我想知道如何找到框架中一组特征的旋转矩阵 我会更具体 我有 2 个具有 20 个特征的帧 假设第 1 帧和第 2 帧 我可以估计两个帧中特征的位置 例如 假设位置 x y 处的某个第 1 帧特征 并且我确切地知道它在哪里 所以假设为 x y
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • 计算机如何评估巨大的数字?

    例如 如果我输入一个值 1234567 98787878 Wolfram Alpha 可以为我提供许多细节 这包括小数近似 总长度 最后一位数字等等 您如何评估如此大的数字 据我了解 编程语言必须具有特殊的数据类型才能存储数字 更不用说将其
  • 几何:找到两点之间特定距离的点

    这类似于这个问题 https stackoverflow com questions 328107 how can you determine a point is between two other points on a line se
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代

随机推荐