मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसमें अलग-अलग तत्व हैं। कार्य टुपल्स की कुल संख्या को गिनना है जैसे कि उन सभी में एक ही उत्पाद हो।
यदि टपल (a,b,c,d) है, तो यह मान्य होगा यदि यह टपल अनुसरण करता है (a*b =c*d)। उदाहरण के लिए,
इनपुट-1 :
arr[]= {2,4,6,3}
आउटपुट :
8
व्याख्या:टुपल्स की कुल संख्या 8 है और ये हैं, (2 6 3 4),(2,6,4,3),(6,2,3,4),(6,2,4,3),( 3,4,2,6),(4,3,2,6) ,(3,4,6,2), (4,3,6,2) जिसमें a*b =c*d.पी>
इस समस्या को हल करने का तरीका -
इस समस्या को हल करने का विचार यह है कि हम जोड़े में सभी गुणा के लिए हैशमैप का उपयोग करेंगे।
इससे यह सुनिश्चित करने में मदद मिलेगी कि मानचित्र में संग्रहीत सभी युग्मों का गुणन समान है।
दिए गए सरणी में प्रत्येक तत्व के गुणन का नक्शा बनाने के बाद, हम नक्शे के माध्यम से जांच करेंगे कि कितने जोड़े ऐसे हैं जिनका गुणन (a*b =c*d) के रूप में है।पी>
चूंकि जोड़े की कुल संख्या को n*(n-1)/2 के रूप में गिना जा सकता है और एक जोड़ी में '4' संख्याएं होती हैं जिनमें अधिकतम 4*2 ऐसे क्रमपरिवर्तन हो सकते हैं। इस प्रकार प्रत्येक तत्व के लिए, इसमें n*(n1)/2*8 जोड़े हो सकते हैं।
-
सरणी तत्वों का इनपुट लें।
-
एक पूर्णांक फ़ंक्शन countTuples(int *arr, int n) सरणी तत्व और उसके आकार को इनपुट के रूप में लेता है। और (a*b =c*d) के रूप में समान उत्पाद वाले टुपल्स की संख्या लौटाता है।
-
ऐसा हैशमैप बनाना कि कुंजी युग्म का गुणनफल हो और उन युग्मों की आवृत्ति के रूप में मान हो।
-
मानचित्र पर पुनरावृति करना और समान उत्पाद वाले ऐसे टुपल्स की संख्या गिनना।
उदाहरण
#include <bits/stdc++.h> using namespace std; int countTuple(int *arr, int n) { map<int, int> mp; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) mp[arr[i] * arr[j]]++; int ans = 0; for (auto it : mp) ans += (it.second * (it.second - 1) / 2) * 8; return ans; } int main(){ int n=4; int arr[n]= {2,4,6,3}; int res= countTuple(arr,n); cout<<res<<" "; return 0; }
आउटपुट
8
एक ही उत्पाद टुपल्स वाले सभी टुपल्स 8 हैं।