০-৯ অঙ্কের একটি স্ট্রিং দেওয়া আছে। ৮ দিয়ে বিভাজ্য কিন্তু ৩ দিয়ে বিভাজ্য নয় এমন সাবস্ট্রিংয়ের সংখ্যা বের করতে হবে।
ইনপুট/আউটপুট উদাহরণ
ইনপুট: "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
উপসংহার
সাবস্ট্রিং ৮ দিয়ে বিভাজ্য কিন্তু ৩ দিয়ে না এমন موارد গণনা করার জন্য প্রিফিক্স সাম এবং মডুলো অ্যারিথমেটিক ব্যবহার করা হয়েছে।