একটি সংখ্যা দেওয়া আছে। আমাদের দুটি পেয়ার খুঁজে বের করতে হবে, যারা 그 সংখ্যক দুটি কিউবের সমষ্টি হিসেবে প্রকাশ করতে পারে। অর্থাৎ, আমাদের দুটি পেয়ার (a, b) এবং (c, d) খুঁজে বের করতে হবে যাতে দেওয়া সংখ্যা n কে n = a³ + b³ = c³ + d³ হিসেবে প্রকাশ করা যায়।
আইডিয়াটি সহজ। এখানে প্রতিটি সংখ্যা a, b, c এবং d সবই n^(1/3) ছোট। n^(1/3) ছোট সংখ্যা গুলো দিয়ে তৈরি প্রতিটি ভিন্ন পেয়ার (x, y) এর জন্য, যদি তাদের সমষ্টি (x³ + y³) দেওয়া সংখ্যার সমান হয়, তবে সেগুলো হ্যাশ টেবিলে সমষ্টি মান কী হিসেবে স্টোর করব। তারপর যদি একই সমষ্টি আবার আসে, তবে সাধারনভাবেই প্রতিটি পেয়ার প্রিন্ট করব।
অ্যালগরিদম
getPairs(n):
শুরু
cube_root := n-এর কিউব রুট
map হিসেবে int টাইপ কী এবং পেয়ার টাইপ ভ্যালু
i = 1 থেকে cube_root পর্যন্ত, করো
j = i + 1 থেকে cube_root পর্যন্ত, করো
sum = i³ + j³
যদি sum n-এর সমান না হয়, তবে পরবর্তী অংশ বাদ দিয়ে দ্বিতীয় ইটারেশনে যাও
যদি sum map-এ উপস্থিত থাকে, তবে পেয়ার এবং (i, j) প্রিন্ট করো
অন্যথায় (i,j) সংশ্লিষ্ট sum-সাথে map-এ ইনসার্ট করো
শেষ
শেষ
শেষ
উদাহরণ (C++ কোড)
#include <iostream>
#include <cmath>
#include <map>
using namespace std;
int getPairs(int n) {
int cube_root = pow(n, 1.0/3.0);
map<int, pair<int, int> > my_map;
for(int i = 1; i < cube_root; i++) {
for(int j = i + 1; j <= cube_root; j++) {
int sum = i*i*i + j*j*j;
if(sum != n)
continue;
if(my_map.find(sum) != my_map.end()) {
cout << "(" << my_map[sum].first << ", " << my_map[sum].second << ") and (" << i << ", " << j << ")" << endl;
} else {
my_map[sum] = make_pair(i, j);
}
}
}
}
int main() {
int n = 13832;
getPairs(n);
}
আউটপুট
(2, 24) and (18, 20)