अवधारणा
एक दिए गए पूर्णांक X के संबंध में, हमारा कार्य अधिकतम मान N निर्धारित करना है ताकि पहले N प्राकृतिक संख्याओं का योग X से अधिक न हो।
इनपुट
X = 7
आउटपुट
2
2, N का अधिकतम संभव मान है क्योंकि N = 3 के लिए, श्रृंखला का योग X से अधिक हो जाएगा यानी 1^2 + 2^2 + 3^2 = 1 + 4 + 9 = 14
इनपुट
X = 27
आउटपुट
3
3, N का अधिकतम संभव मान है क्योंकि N = 4 के लिए, श्रृंखला का योग X से अधिक हो जाएगा यानी 1^2 + 2^2 + 3^2 + 4^2 = 1 + 4 + 9 + 16 = 30
विधि
सरल समाधान − यहां, एक सरल समाधान है कि 1 से अधिकतम N तक एक लूप चलाएं ताकि S(N) ≤ X, इस स्थिति में S(N) को पहले N प्राकृतिक संख्याओं के वर्गों के योग के रूप में जाना जाता है। इसके परिणामस्वरूप, पहले N प्राकृतिक संख्याओं के वर्गों का योग सूत्र S(N) = N * (N + 1) * (2 * N + 1) / 6 द्वारा दिया जाता है।
यह ध्यान दिया जाना चाहिए कि इस दृष्टिकोण की समय जटिलता O(N) है।
कुशल दृष्टिकोण − हम एक और कुशल समाधान लागू कर सकते हैं जो बाइनरी खोज दृष्टिकोण पर आधारित है।
हम नीचे दिए गए एल्गोरिदम का पालन करते हैं जिसे चरण दर चरण समझाया गया है −
बड़े सरणी में बाइनरी खोज शुरू करें और mid को (low + high) / 2 के रूप में प्राप्त करें
यह देखा गया है कि यदि दोनों सरणी से मान समान है तो तत्व दाहिने भाग में होना चाहिए इसलिए low को mid के रूप में चिह्नित करें
अन्यथा high को mid के रूप में चिह्नित करें क्योंकि यदि mid तत्व समान नहीं है तो तत्व बड़े सरणी के बाएं भाग में होना चाहिए।
यह ध्यान दिया जाना चाहिए कि इस दृष्टिकोण की समय जटिलता O(log N) है।
उदाहरण
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define ll long long // पहले N1 प्राकृतिक संख्याओं के वर्गों का योग लौटाने वाला फ़ंक्शन ll squareSum(ll N1){ ll sum1 = (ll)(N1 * (N1 + 1) * (2 * N1 + 1)) / 6; return sum1; } // अधिकतम N लौटाने वाला फ़ंक्शन जैसे कि पहले N प्राकृतिक संख्याओं के वर्गों का योग X से अधिक न हो ll findMaxN(ll X){ ll low1 = 1, high1 = 100000; int N1 = 0; while (low1 <= high1) { ll mid1 = (high1 + low1) / 2; if (squareSum(mid1) <= X) { N1 = mid1; low1 = mid1 + 1; } else high1 = mid1 - 1; } return N1; } // ड्राइवर कोड int main(){ ll X = 27; cout << findMaxN(X); return 0; }आउटपुट
3