কম্পিউটার টিউটোরিয়াল

N পূর্ণসংখ্যার অ্যারেতে একটি নন-খালি সাবসেট খুঁজুন যার যোগফল N দ্বারা বিভাজ্য (C++)

সমস্যা বিবরণ

n সংখ্যার একটি অ্যারে দেওয়া থাকলে, একটি নন-খালি সাবসেট খুঁজে বের করতে হবে যাতে সাবসেটটির উপাদানগুলোর যোগফল n দ্বারা বিভাজ্য হয়। এমন কোনো সাবসেট পাওয়া গেলে তার আকার এবং মূল অ্যারেতে উপাদানগুলির ইন্ডেক্স আউটপুট করা হবে।

উদাহরণ: ইনপুট [3, 2, 7, 1, 9] হলে আউটপুট হবে আকার 2 এবং ইন্ডেক্স [1, 2]।

সমাধানের ধাপসমূহ

  • একটি ম্যাপ (my_map) সংজ্ঞায়িত করুন
  • add := 0
  • i = 0 থেকে N-1 পর্যন্ত লুপ চালান:
    • add := (add + arr[i]) mod N
    • যদি add == 0 হয়, তবে প্রথম i+1 উপাদানই উত্তর
    • যদি add মানটি my_map-এ ইতিমধ্যে থাকে, তবে my_map[add]+1 থেকে i পর্যন্ত উপাদানগুলি উত্তর
    • অন্যথায় my_map[add] = i সেট করুন

C++ উদাহরণ

#include <bits/stdc++.h>
using namespace std;

void subset_find(int arr[], int N) {
    unordered_map<int, int> my_map;
    int add = 0;
    for (int i = 0; i < N; i++) {
        add = (add + arr[i]) % N;
        if (add == 0) {
            cout << i + 1 << endl;
            for (int j = 0; j <= i; j++)
                cout << j + 1 << " ";
            return;
        }
        if (my_map.find(add) != my_map.end()) {
            cout << (i - my_map[add]) << endl;
            for (int j = my_map[add] + 1; j <= i; j++)
                cout << j + 1 << " ";
            return;
        }
        else
            my_map[add] = i;
    }
}

int main() {
    int arr[] = {3, 2, 7, 1, 9};
    int N = sizeof(arr) / sizeof(arr[0]);
    subset_find(arr, N);
}

ইনপুট

{3, 2, 7, 1, 9}

আউটপুট

2 1 2
  1. C++-এ সার্কুলার অ্যারেতে আঁচবিক উপাদান ছাড়া সর্বোচ্চ যোগফল বের করার পদ্ধতি

  2. C++ ব্যবহার করে অ্যারেতে বাম ও ডান পাশের যোগফল সমান হয় এমন এলিমেন্ট বের করা

  3. C++ ব্যবহার করে অ্যারেতে এমন এলিমেন্ট বের করা যেটি সব এলিমেন্টকে ভাগ করে দেয়

  4. C++ ব্যবহার করে অ্যারেতে a % b = k সেটি করার সব জোড়া (a, b) বের করা