#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int longestSubarrayNotDivisibleByX(const vector<int>& b, int x) {
int n = b.size();
unordered_map<int, int> first_occurrence; // mod value -> first index
int prefix_sum = 0;
int max_len = -1; // no valid subarray yet
for (int i = 0; i < n; ++i) {
prefix_sum += b[i];
// ⚠️ Step 1: Compute safe mod
int mod = ((prefix_sum % x) + x) % x;
// ✅ Case 1: sum from 0 to i is not divisible by x
if (mod != 0) {
max_len = max(max_len, i + 1);
}
// ❌ Case 2: mod == 0 -> sum divisible by x
// Try to skip some prefix to get non-divisible sum
if (first_occurrence.count(mod)) {
int j = first_occurrence[mod];
max_len = max(max_len, i - j); // remove prefix up to j
} else {
first_occurrence[mod] = i; // store only first occurrence
}
}
return max_len;
}
int main() {
vector<int> b = {3, 1, 2, 2, 4};
int x = 3;
int result = longestSubarrayNotDivisibleByX(b, x);
cout << "Longest subarray length (sum not divisible by " << x << "): " << result << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBsb25nZXN0U3ViYXJyYXlOb3REaXZpc2libGVCeVgoY29uc3QgdmVjdG9yPGludD4mIGIsIGludCB4KSB7CiAgICBpbnQgbiA9IGIuc2l6ZSgpOwogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gZmlyc3Rfb2NjdXJyZW5jZTsgIC8vIG1vZCB2YWx1ZSAtPiBmaXJzdCBpbmRleAogICAgaW50IHByZWZpeF9zdW0gPSAwOwogICAgaW50IG1heF9sZW4gPSAtMTsgIC8vIG5vIHZhbGlkIHN1YmFycmF5IHlldAoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcHJlZml4X3N1bSArPSBiW2ldOwoKICAgICAgICAvLyDimqDvuI8gU3RlcCAxOiBDb21wdXRlIHNhZmUgbW9kCiAgICAgICAgaW50IG1vZCA9ICgocHJlZml4X3N1bSAlIHgpICsgeCkgJSB4OwoKICAgICAgICAvLyDinIUgQ2FzZSAxOiBzdW0gZnJvbSAwIHRvIGkgaXMgbm90IGRpdmlzaWJsZSBieSB4CiAgICAgICAgaWYgKG1vZCAhPSAwKSB7CiAgICAgICAgICAgIG1heF9sZW4gPSBtYXgobWF4X2xlbiwgaSArIDEpOwogICAgICAgIH0KCiAgICAgICAgLy8g4p2MIENhc2UgMjogbW9kID09IDAgLT4gc3VtIGRpdmlzaWJsZSBieSB4CiAgICAgICAgLy8gVHJ5IHRvIHNraXAgc29tZSBwcmVmaXggdG8gZ2V0IG5vbi1kaXZpc2libGUgc3VtCiAgICAgICAgaWYgKGZpcnN0X29jY3VycmVuY2UuY291bnQobW9kKSkgewogICAgICAgICAgICBpbnQgaiA9IGZpcnN0X29jY3VycmVuY2VbbW9kXTsKICAgICAgICAgICAgbWF4X2xlbiA9IG1heChtYXhfbGVuLCBpIC0gaik7ICAvLyByZW1vdmUgcHJlZml4IHVwIHRvIGoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaXJzdF9vY2N1cnJlbmNlW21vZF0gPSBpOyAgLy8gc3RvcmUgb25seSBmaXJzdCBvY2N1cnJlbmNlCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBtYXhfbGVuOwp9CmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYiA9IHszLCAxLCAyLCAyLCA0fTsgCiAgICBpbnQgeCA9IDM7CgogICAgaW50IHJlc3VsdCA9IGxvbmdlc3RTdWJhcnJheU5vdERpdmlzaWJsZUJ5WChiLCB4KTsKICAgIGNvdXQgPDwgIkxvbmdlc3Qgc3ViYXJyYXkgbGVuZ3RoIChzdW0gbm90IGRpdmlzaWJsZSBieSAiIDw8IHggPDwgIik6ICIgPDwgcmVzdWx0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K