查找立方体对|集1(n^(2/3)解决方案)

给定一个数n,找到两对可以表示为两个立方体之和的数。换句话说,找到两对(a,b)和(c,d),这样给定的数字n可以表示为

null
n = a^3 + b^3 = c^3 + d^3

其中a、b、c和d是四个不同的数字。

例如:

Input: N = 1729Output: (1, 12) and (9, 10)Explanation: 1729 = 1^3 + 12^3 = 9^3 + 10^3Input: N = 4104Output: (2, 16) and (9, 15)Explanation: 4104 = 2^3 + 16^3 = 9^3 + 15^3Input: N = 13832Output: (2, 24) and (18, 20)Explanation: 13832 = 2^3 + 24^3 = 18^3 + 20^3

满足约束的任何数字n都将有两个不同的对(a,b)和(c,d),使得a,b,c和d都小于 N 1/3 .这个想法很简单。对于由小于 N 1/3 ,如果它们的总和(x 3. +y 3. )等于给定的数字,我们将它们存储在一个哈希表中,使用sum作为键。如果总和等于给定数字的对再次出现,我们只需打印两对。

1) Create an empty hash map, say s.2) cubeRoot = n1/33) for (int x = 1; x < cubeRoot; x++)     for (int y = x + 1; y <= cubeRoot; y++)       int sum = x3 + y3;       if (sum != n) continue;       if sum exists in s,         we found two pairs with sum, print the pairs       else         insert pair(x, y) in s using sum as key

以下是上述想法的实施情况——

C++

// C++ program to find pairs that can represent
// the given number as sum of two cubes
#include <bits/stdc++.h>
using namespace std;
// Function to find pairs that can represent
// the given number as sum of two cubes
void findPairs( int n)
{
// find cube root of n
int cubeRoot = pow (n, 1.0/3.0);
// create an empty map
unordered_map< int , pair< int , int > > s;
// Consider all pairs such with values less
// than cuberoot
for ( int x = 1; x < cubeRoot; x++)
{
for ( int y = x + 1; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue ;
// if sum is seen before, we found two pairs
if (s.find(sum) != s.end())
{
cout << "(" << s[sum].first << ", "
<< s[sum].second << ") and ("
<< x << ", " << y << ")" << endl;
}
else
// if sum is seen for the first time
s[sum] = make_pair(x, y);
}
}
}
// Driver function
int main()
{
int n = 13832;
findPairs(n);
return 0;
}


JAVA

// Java program to find pairs that can represent
// the given number as sum of two cubes
import java.util.*;
class GFG
{
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
// Function to find pairs that can represent
// the given number as sum of two cubes
static void findPairs( int n)
{
// find cube root of n
int cubeRoot = ( int ) Math.pow(n, 1.0 / 3.0 );
// create an empty map
HashMap<Integer, pair> s = new HashMap<Integer, pair>();
// Consider all pairs such with values less
// than cuberoot
for ( int x = 1 ; x < cubeRoot; x++)
{
for ( int y = x + 1 ; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue ;
// if sum is seen before, we found two pairs
if (s.containsKey(sum))
{
System.out.print( "(" + s.get(sum).first+ ", "
+ s.get(sum).second+ ") and ("
+ x+ ", " + y+ ")" + "" );
}
else
// if sum is seen for the first time
s.put(sum, new pair(x, y));
}
}
}
// Driver code
public static void main(String[] args)
{
int n = 13832 ;
findPairs(n);
}
}
// This code is contributed by PrinciRaj1992


Python3

# Python3 program to find pairs
# that can represent the given
# number as sum of two cubes
# Function to find pairs that
# can represent the given number
# as sum of two cubes
def findPairs(n):
# Find cube root of n
cubeRoot = pow (n, 1.0 / 3.0 );
# Create an empty map
s = {}
# Consider all pairs such with
# values less than cuberoot
for x in range ( int (cubeRoot)):
for y in range (x + 1 ,
int (cubeRoot) + 1 ):
# Find sum of current pair (x, y)
sum = x * x * x + y * y * y;
# Do nothing if sum is not equal to
# given number
if ( sum ! = n):
continue ;
# If sum is seen before, we
# found two pairs
if sum in s.keys():
print ( "(" + str (s[ sum ][ 0 ]) +
", " + str (s[ sum ][ 1 ]) +
") and (" + str (x) +
", " + str (y) +
")" + "" )
else :
# If sum is seen for the first time
s[ sum ] = [x, y]
# Driver code
if __name__ = = "__main__" :
n = 13832
findPairs(n)
# This code is contributed by rutvik_56


C#

// C# program to find pairs that can represent
// the given number as sum of two cubes
using System;
using System.Collections.Generic;
class GFG
{
class pair
{
public int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
// Function to find pairs that can represent
// the given number as sum of two cubes
static void findPairs( int n)
{
// find cube root of n
int cubeRoot = ( int ) Math.Pow(n, 1.0/3.0);
// create an empty map
Dictionary< int , pair> s = new Dictionary< int , pair>();
// Consider all pairs such with values less
// than cuberoot
for ( int x = 1; x < cubeRoot; x++)
{
for ( int y = x + 1; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue ;
// if sum is seen before, we found two pairs
if (s.ContainsKey(sum))
{
Console.Write( "(" + s[sum].first+ ", "
+ s[sum].second+ ") and ("
+ x+ ", " + y+ ")" + "" );
}
else
// if sum is seen for the first time
s.Add(sum, new pair(x, y));
}
}
}
// Driver code
public static void Main(String[] args)
{
int n = 13832;
findPairs(n);
}
}
// This code is contributed by PrinciRaj1992


输出:

(2, 24) and (18, 20)

时间复杂性 上述溶液的浓度为O(n) 2/3 )这比O(n)小得多。

我们能用O(n)来解决上述问题吗 1/3 )时间?我们将在下一篇文章中讨论这个问题。

本文由 阿迪蒂亚·戈尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享