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

时间:2015-08-22 16:15:52

标签: math cubes

我正在尝试编写一个程序来检查数字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?任何人都可以建议更快的approch

3 个答案:

答案 0 :(得分:2)

我也在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 = square

当(如果)找到一个正方形时,你有divisor =(a + b)和sqrt(square)=(a-b),所以你有a和b。

如果找不到方形,则该数字不是两个立方体的总和。

我们知道除数&lt; (4(a ^ 3 + b ^ 3)^(1/3)并且此限制改进了任务,因为当你正在组装(a ^ 3 + b ^ 3)的除数时,立即丢弃那些大于限制的除数。

现在与其他算法进行一些比较 - 对于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个素数的表,在这个范围内效果非常好。

Miguel Velilla

答案 1 :(得分:1)

要查找立方体时总和为 n 的所有整数对 x y ,请设置 x 到小于 n 的立方根的最大整数,将 y 设置为0,然后如果多维数据集的总和重复添加1到 y 小于 n ,如果多维数据集的总和大于 n ,则从 x 中减去1,否则输出该对,在< em> x 和 y 交叉。如果您只想知道这对是否存在,您可以在找到它后立即停止。

如果您在编写此算法时遇到问题,请告诉我们。

答案 2 :(得分:0)

这是 LEETCODE 中“两和问题”的变体

   def update_dynamic_link(instance, created, **kwargs):
       if created:
           instance.dynamic_link = self.slug #Put whatever you want to assign
           instance.save(update_fields=['dynamic_link'])

   model.signals.post_save(update_dynamic_link, sender=TestModel)