কম্পিউটার

সারি এবং কলাম অদলবদল করে তৈরি করা যেতে পারে এমন অনন্য ম্যাট্রিক্সের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম


ধরুন, আমাদের একটি n x n ম্যাট্রিক্স আছে। ম্যাট্রিক্সের প্রতিটি উপাদান অনন্য এবং এটি 1 এবং n 2 এর মধ্যে একটি পূর্ণসংখ্যা। . এখন আমরা নিচের কাজগুলো যেকোনো পরিমাণে এবং যেকোনো ক্রমে সম্পাদন করতে পারি।

  • আমরা ম্যাট্রিক্সে যেকোন দুটি পূর্ণসংখ্যা x এবং y বাছাই করি, যেখানে (1 ≤ x

  • আমরা ম্যাট্রিক্সে থাকা যেকোনো দুটি পূর্ণসংখ্যা x এবং y বেছে নিই, যেখানে (1 ≤ x

  • আমাদের মনে রাখতে হবে যে x + y ≤ k এবং মানগুলি অবশ্যই একই সারি এবং কলামে উপস্থিত থাকবে না।

অপারেশন সম্পাদনের মাধ্যমে পাওয়া যায় এমন অনন্য ম্যাট্রিকের সংখ্যা আমাদের খুঁজে বের করতে হবে।

সুতরাং, যদি ইনপুটটি n =3, k =15, mat ={{4, 3, 6}, {5, 9, 7}, {1, 2, 8}} এর মত হয়, তাহলে আউটপুট হবে 36।

উদাহরণস্বরূপ, বাছাই করা দুটি মান হল x =3 এবং y =5। কলামগুলি অদলবদল করা হলে ফলাফল ম্যাট্রিক্স হবে −

3 4 69 5 72 1 8

এইভাবে 36টি অনন্য ম্যাট্রিক্স পাওয়া যেতে পারে।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

একটি ফাংশন dfs() নির্ধারণ করুন ভিজিট করা [k] যদি অ-শূন্য হয়, তাহলে:return visited[k] :=true insert k s তে সূচনা করার জন্য j :=ver[k] এর শুরু, যখন j ver[k] এর শেষ উপাদানের সমান নয় , আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), do:dfs(*j, ver, পরিদর্শন করা, s) আকারের একটি অ্যারে f সংজ্ঞায়িত করুন:51.f[0] :=1 শুরু করার জন্য i :=1, যখন i <=50, আপডেট করুন (i 1 দ্বারা বাড়ান), do:f[i] :=(i * f[i - 1]) mod modval আকারের একটি অ্যারে e সংজ্ঞায়িত করুন n শুরু করার জন্য i :=0 আকারের একটি অ্যারে pk সংজ্ঞায়িত করুন, যখন i k, তারপর:chk :=1 লুপ থেকে বেরিয়ে আসুন যদি chk 0 এর মতো হয়, তাহলে:pk[i] শেষে j ঢোকান pk[j] chk এর শেষে i ঢোকান :=0 শুরু করার জন্য l :=0, যখন l k, তারপর:chk :=1 লুপ থেকে বেরিয়ে আসুন যদি chk 0 এর মত হয়, তাহলে:e[i] এর শেষে j ঢোকান e[j এর শেষে i ঢোকান ]resa :=1, resb =1 আকারের একটি অ্যারে v1 সংজ্ঞায়িত করুন:n এবং আকারের v2:n. শুরু করার জন্য i :=0, যখন i

উদাহরণ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

#include নেমস্পেস ব্যবহার করে std;#define modval 998244353const int INF =1e9;void dfs(int k, vector ver[], bool visited[], stack &s) {যদি (ভিজিট করা [কে]) ফেরত; পরিদর্শন [k] =সত্য; s.push(k); for(vector ::iterator j =ver[k].begin(); j!=ver[k].end(); j++) dfs(*j, ver, visited, s);}void solve( int n, int k, ভেক্টর<ভেক্টর> ম্যাট) { int f[51]; f[0] =1; for(int i =1; i <=50; i++) { f[i] =(i * f[i-1]) % modval; } ভেক্টর e[n]; ভেক্টর pk[n]; for(int i =0; i  k) { chk =1; বিরতি } } if(chk==0) { pk[i].push_back(j); pk[j].push_back(i); } chk =0; for(int l =0;l  k){ chk =1; বিরতি } } if(chk ==0) { e[i].push_back(j); e[j]. push_back(i); } } } int resa =1, resb =1; bool v1[n], v2[n]; for(int i =0; i  s; if(!v1[i]) { dfs(i, pk, v1, s); if(!s.empty()) { resa *=(f[s.size()]) % modval; resa % =modval; } } } for(int i =0;i  s; if(!v2[i]){ dfs(i, e, v2, s); যদি(!s.empty()) { resb *=(f[s.size()]) % modval; resb % =modval; } } } cout<<(resa * resb) % modval;}int main() { int n =3, k =15; ভেক্টর<ভেক্টর> ম্যাট ={{4, 3, 6}, {5, 9, 7}, {1, 2, 8}}; সমাধান (n, k, mat); রিটার্ন 0;

ইনপুট

3, 15, {{4, 3, 6}, {5, 9, 7}, {1, 2, 8}}

আউটপুট

36

  1. একটি গ্রিডে আলোকিত কোষের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

  2. একটি প্রদত্ত গ্রাফে সেতুর প্রান্তের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

  3. একটি গ্রাফ থেকে সর্বাধিক স্কোর কমানো যেতে পারে তা খুঁজে বের করতে C++ প্রোগ্রাম

  4. একটি পাথ তৈরি করতে একটি গ্রিডে ব্লক করার জন্য সেলের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম