Given an array of positive integers nums, remove the smallest subarray (possibly empty) such that the sum of the remaining elements is divisible by p. It is not allowed to remove the whole array.
Return the length of the smallest subarray that you need to remove, or -1 if it's impossible.
A subarray is defined as a contiguous block of elements in the array.
 
Example 1:
Input: nums = [3,1,4,2], p = 6
Output: 1
Explanation: The sum of the elements in nums is 10, which is not divisible by 6. We can remove the subarray [4], and the sum of the remaining elements is 6, which is divisible by 6.

Example 2:
Input: nums = [6,3,5,2], p = 9
Output: 2
Explanation: We cannot remove a single element to get a sum divisible by 9. The best way is to remove the subarray [5,2], leaving us with [6,3] with sum 9.

Example 3:
Input: nums = [1,2,3], p = 3
Output: 0
Explanation: Here the sum is 6. which is already divisible by 3. Thus we do not need to remove anything.

Example 4:
Input: nums = [1,2,3], p = 7
Output: -1
Explanation: There is no way to remove a subarray in order to get a sum divisible by 7.

Example 5:
Input: nums = [1000000000,1000000000,1000000000], p = 3
Output: 0

 
Constraints:

1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= p <= 109

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

def _disabled_input(*args, **kwargs):
    raise RuntimeError("input() is disabled in callable mode")
builtins.input = _disabled_input

ns = {"__name__": "__judge__"}  # prevent if __name__ == "__main__" blocks
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = "class Solution:\n    def minSubarray(self, nums: List[int], p: int) -> int:\n        '''\n        Find subarray[i:j] where i < j such that \n        (sum(arr) - sum(arr[i:j])) % p == 0\n        \n        This can be rewritten with c where c[i] is cumulative sum up to index i\n        \n        Note c[-1] refers to c[len(c)] in Python\n        \n        (c[-1] - (c[j] - c[i])) % p == 0 \n        \n        From Question: Subarray Sums Divisible by K\n        this is the same as:\n        \n        (c[j] - c[i]) % p == c[-1] % p\n        \n        (c[j] - c[i]) % p == target\n        \n        c[j] - c[i] = p*n + target         where n is some number\n        \n        c[j] - p*n - target == c[i]\n        \n        (c[j] % p - p*n % p - target % p) % p == c[i] % p  \n        \n         mod both sides, (a + b) % n == (a % n + b % n) % n, thats why extra % p on LHS\n        \n        (c[j] % p - target % p) % p == c[i] % p\n        \n        (c[j] % p - (c[-1] % p) % p) % p == c[i] % p      expand out target\n        \n        (c[j] % p - (c[-1] % p)) % p == c[i] % p      mod rule: (a % b) % b = a % b\n        \n        (c[j] % p - target) % p == c[i] % p\n        \n        c[i] % p will be stored in the hashmap along with the index\n        Which is why we query the LHS, for it\n        \n        '''\n        for i in range(1, len(nums)):\n            nums[i] += nums[i - 1]\n        \n        target = nums[-1] % p\n        if target == 0: return 0 # Early Exit, we don't have to remove anything\n        \n        ans = len(nums)\n        remainders = {0: -1}\n        \n        for j in range(len(nums)):\n            complement = (nums[j] % p - target) % p\n            \n            if complement in remainders:\n                ans = min(ans, j - remainders[complement])\n                \n            remainders[nums[j] % p] = j\n        \n        return ans if ans < len(nums) else -1"
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'minSubarray'
if _fn_name:
    if "Solution" in ns:
        try:
            _obj = ns["Solution"]()
            if hasattr(_obj, _fn_name):
                _target = getattr(_obj, _fn_name)
        except Exception:
            _target = None
    if _target is None and _fn_name in ns and callable(ns[_fn_name]):
        _target = ns[_fn_name]
# Fallback: if there's exactly one user-defined function, use it
if _target is None:
    _cands = [v for k, v in ns.items() if callable(v) and getattr(v, "__module__", "") in ("__judge__", "__main__")]
    _user_funcs = [c for c in _cands if getattr(c, "__name__", "").startswith("_") is False]
    if len(_user_funcs) == 1:
        _target = _user_funcs[0]
if _target is None:
    raise RuntimeError(f"Could not resolve callable '{_fn_name}'")

_raw = sys.stdin.read().strip()
if _raw:
    _parsed = json.loads(_raw)
    if isinstance(_parsed, dict):
        _kwargs = _parsed.get("kwargs", {})
        _args = _parsed.get("args", [])
    else:
        _args, _kwargs = _parsed, {}
else:
    _args, _kwargs = [], {}
if not isinstance(_args, (list, tuple)):
    _args = [_args]
_res = _target(*_args, **_kwargs)
try:
    sys.stdout.write(repr(_res) + "\n")
except Exception:
    pass

```

Measured memory_bytes: 5800