0-9 এর একটি স্ট্রিং দেওয়া আছে। এই সমস্যার জন্য, আমাদের 8 দ্বারা বিভাজ্য স্ট্রিংগুলির সংখ্যা গণনা করতে হবে এবং 3 দ্বারা নয়। এটি একটি 2 ধাপের সমস্যা, এবং এটি সমাধান করার জন্য আমাদের কোডটি একবারে এক ধাপ করতে হবে, উদাহরণস্বরূপ
ইনপুট
str = "80"
আউটপুট
2
ইনপুট
str = "7675636788"
আউটপুট
15
সমাধান খোঁজার পদ্ধতি
শুধুমাত্র শেষ 3টি সংখ্যা সহ সংখ্যাগুলি 8 দ্বারা বিভাজ্য, এবং 3 দ্বারা বিভাজ্য তাদের সংখ্যাগুলির যোগফল 8 দ্বারা বিভাজ্য৷
এখন স্ট্রিংয়ের উপসর্গের যোগফল সংরক্ষণ করুন যাতে প্রিফিক্স মডিউল 3-এর অঙ্কের যোগফল হয় 0,1 বা 2 হয়। তারপর i-এর সমস্ত অবস্থানের জন্য স্ট্রিংটি পুনরাবৃত্তি করা হয়। তারপর i-তে সাবস্ট্রিংগুলির সংখ্যা গণনা করুন, যেগুলি 8 দ্বারা বিভাজ্য—এখন, i-তে সাবস্ট্রিংগুলির সংখ্যা বিয়োগ করুন, যেগুলি এই মান থেকে 3 দ্বারা বিভাজ্য৷
|এস| X 3 আকারের 2D অ্যারে সংজ্ঞায়িত করা হয়েছে, |S| একটি স্ট্রিং এর আকার, বলুন dp[i][j]।
যেকোনো সূচকে i dp[i][j]। সূচী i থেকে শুরু করে 0 পর্যন্ত, সাবস্ট্রিং সংখ্যার আউটপুট j আছে। তাই 0<=j<=0, যেহেতু মডিউল 3।
এক-অঙ্ক, দুই-অঙ্ক, এবং তিন-অঙ্কের সংখ্যাগুলি 8 দ্বারা বিভাজ্য কিনা তা পরীক্ষা করার জন্য আমাদের স্ট্রিংটির উপর পুনরাবৃত্তি করতে হবে৷
-
একটি অক্ষর সূচীতে 8 কিনা তা নির্ধারণ করতে, সূচকে সংখ্যাটি পরীক্ষা করুন।
-
যদি দুটি সংখ্যা থাকে তবে সংখ্যাটিকে 3 এর পরিবর্তে 8 দিয়ে ভাগ করুন।
আসুন ধরে নিই সংখ্যাটি 8 দ্বারা বিভাজ্য। 8 দ্বারা বিভাজ্য হলে অবশ্যই দুটি (1-3) সাবস্ট্রিং থাকতে হবে। তবে, এতে সাবস্ট্রিংও থাকবে, যেগুলি 8 দ্বারা বিভাজ্য। সেগুলি অপসারণ করতে।
উদাহরণ
#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++;
}
// Taking 3 digit number.
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
উপসংহার
এই সমস্যায়, আমরা শিখেছি কিভাবে c++ কোড সহ 3 দ্বারা নয় 8 দ্বারা বিভাজ্য সাবস্ট্রিং সংখ্যা বের করতে হয়। এই কোড জাভা, পাইথন এবং অন্যান্য ভাষায় লেখা যেতে পারে। এই সমস্যাটি সমাধান করার জন্য, আমরা 8 দ্বারা বিভাজ্য কিন্তু 3 দ্বারা বিভাজ্য নয় এমন সাবস্ট্রিংগুলির সংখ্যা খুঁজে পেতে একটি স্ট্রিংকে উল্টে দিয়েছি৷ একবার আমরা এটিকে 2 ভাগে ভাগ করলে এটি একটি খুব সোজা সমস্যা৷