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

C++-এ স্ট্রিংয়ে ৮ দিয়ে বিভাজ্য কিন্তু ৩ দিয়ে না এমন সাবস্ট্রিং গণনা

০-৯ অঙ্কের একটি স্ট্রিং দেওয়া আছে। ৮ দিয়ে বিভাজ্য কিন্তু ৩ দিয়ে বিভাজ্য নয় এমন সাবস্ট্রিংয়ের সংখ্যা বের করতে হবে।

ইনপুট/আউটপুট উদাহরণ

ইনপুট: "80" → আউটপুট: 2
ইনপুট: "7675636788" → আউটপুট: 15

সমাধানের পদ্ধতি

সাবস্ট্রিং ৮ দিয়ে বিভাজ্য হলে এর শেষ ৩ অঙ্ক ৮ দিয়ে বিভাজ্য হবে। ৩ দিয়ে বিভাজ্যতা চেকের জন্য অঙ্কগুলোর যোগফল ৩ দিয়ে বিভাজ্য কিনা দেখা হয়। প্রিফিক্স সাম মডুলো ৩ স্টোর করুন। প্রতিটি পজিশনে ১, ২, ৩ অঙ্কের সংখ্যা ৮ দিয়ে বিভাজ্য কিনা চেক করুন। ৩ দিয়ে বিভাজ্য موارد বাদ দিন।

উদাহরণ

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

#define MAX 1000 

int count(char s[], int len) { 
    int cur = 0, dig = 0; 
    int sum[MAX], dp[MAX][3]; 
    memset(sum, 0, sizeof(sum)); 
    memset(dp, 0, sizeof(dp)); 
    dp[0][0] = 1; 
    for (int i = 1; i <= len; i++) { 
        dig = int(s[i - 1]) - 48; 
        cur += dig; cur %= 3; 
        sum[i] = cur; 
        dp[i][0] = dp[i-1][0]; 
        dp[i][1] = dp[i-1][1]; 
        dp[i][2] = dp[i-1][2]; 
        dp[i][sum[i]]++; 
    } 
    int ans = 0, dprev = 0, value = 0, dprev2 = 0; 
    for (int i = 1; i <= len; i++) { 
        dig = int(s[i - 1]) - 48; 
        if (dig == 8) ans++; 
        if (i - 2 >= 0) { 
            dprev = int(s[i - 2]) - 48; 
            value = dprev * 10 + dig; 
            if (value % 8 == 0 && value % 3 != 0) ans++; 
        } 
        if (i - 3 >= 0) { 
            dprev2 = int(s[i - 3]) - 48; 
            dprev = int(s[i - 2]) - 48; 
            value = dprev2 * 100 + dprev * 10 + dig; 
            if (value % 8 != 0) continue; 
            ans += (i - 2); 
            ans -= dp[i - 3][sum[i]]; 
        } 
    } 
    return ans; 
} 

int main() { 
    char str[] = "7675636788"; 
    int len = strlen(str); 
    cout << count(str, len) << endl; 
    return 0; 
}

আউটপুট

4

উপসংহার

সাবস্ট্রিং ৮ দিয়ে বিভাজ্য কিন্তু ৩ দিয়ে না এমন موارد গণনা করার জন্য প্রিফিক্স সাম এবং মডুলো অ্যারিথমেটিক ব্যবহার করা হয়েছে।

  1. C++ প্রোগ্রাম: বড় সংখ্যা ২৫ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)

  2. C++ প্রোগ্রাম: বড় সংখ্যা ২০ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)

  3. C++ প্রোগ্রাম: বড় সংখ্যা ২, ৩ ও ৫ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)

  4. C++ প্রোগ্রাম: বড় সংখ্যা ১১ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)