MEX of LCM (Codeforces 1834E)
Tags: Math, number theory

You are given an array $$$a$$$ of length $$$n$$$. A positive integer $$$x$$$ is called good if it is impossible to find a subsegment$$$^{\dagger}$$$ of the array such that the least common multiple of all its elements is equal to $$$x$$$.You need to find the smallest good integer.A subsegment$$$^{\dagger}$$$ of the array $$$a$$$ is a set of elements $$$a_l, a_{l + 1}, \ldots, a_r$$$ for some $$$1 \le l \le r \le n$$$. We will denote such subsegment as $$$[l, r]$$$.

Input: Each test consists of multiple test cases. The first line of each test case contains a single integer $$$t$$$ ($$$1 \le t \le 5 \cdot 10^4$$$) — the number of test cases. The description of test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \leq n \leq 3 \cdot 10^5$$$) — the length of the array $$$a$$$.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \ldots , a_n$$$ ($$$1 \leq a_i \leq 10^9$$$) — the elements of the array $$$a$$$.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$3 \cdot 10^5$$$.

Output: For each test case, output a single integer — the smallest good integer.

Note: In the first test case, $$$4$$$ is a good integer, and it is the smallest one, since the integers $$$1,2,3$$$ appear in the array, which means that there are subsegments of the array of length $$$1$$$ with least common multiples of $$$1,2,3$$$. However, it is impossible to find a subsegment of the array with a least common multiple equal to $$$4$$$.In the second test case, $$$7$$$ is a good integer. The integers $$$1,2,3,4,5$$$ appear explicitly in the array, and the integer $$$6$$$ is the least common multiple of the subsegments $$$[2, 3]$$$ and $$$[1, 3]$$$.In the third test case, $$$1$$$ is a good integer, since the least common multiples for the integer in the subsegments $$$[1, 1], [1, 2], [2, 2]$$$ are $$$2,6,3$$$, respectively.

Sample Inputs:
6
3
1 2 3
5
1 2 3 4 5
2
2 3
1
1000000000
12
1 8 4 2 3 5 7 2 9 10 11 13
12
7 2 5 4 2 1 1 2 3 11 8 9

Sample Outputs:
4
7
1
1
16
13

Solution (Python):
import sys, threading, bisect, heapq, math
from functools import cmp_to_key as ctk
from collections import defaultdict, deque
readline = sys.stdin.readline
read = lambda : [int(x) for x in readline().split()]
alloc = lambda dfv, *s: len(s) != 1 and [alloc(dfv, *s[1:]) for _ in range(int(s[0]))] or [dfv] * int(s[0])
bet = lambda a, b: a <= b and range(a, b + 1) or range(a, b - 1, -1)
show = lambda arr: print(' '.join(map(str, arr)))
INF = float('inf')
MOD = 10 ** 9 + 7
gcd = lambda a, b: gcd(b, a % b) if b else a
lcm = lambda a, b: a * b // gcd(a, b)

def main():
    for _wzl_ in range(int(input())):
        (n,) = read()
        arr = read()
        k = 19 * n
        (s, f) = (set(), set())
        for x in arr:
            t = set()
            for y in f:
                num = lcm(x, y)
                if num < k:
                    s.add(num)
                    t.add(num)
            s.add(x)
            t.add(x)
            f = t
        res = 1
        while res in s:
            res += 1
        print(res)
main()

Solution (Python):
import sys

def gcd(a, b):
    while a > 0 and b > 0:
        c = a
        a = b % a
        b = c
    return a + b

def solve():
    n = int(input())
    a = list(map(int, input().split()))
    n = len(a)
    all_nums = set()
    cur = {1}
    for i in range(n):
        new_nums = set()
        for c in cur:
            nxt = c * a[i] // gcd(c, a[i])
            if nxt > 1000000000.0 + 7:
                continue
            new_nums.add(nxt)
        new_nums.add(a[i])
        all_nums.update(new_nums)
        cur = new_nums
    for i in range(1, int(1000000000.0 + 7)):
        if i not in all_nums:
            print(i)
            return
t = int(input())
for _ in range(t):
    solve()

Solution (Python):
import sys
input = sys.stdin.buffer.readline
from math import gcd
for _ in range(int(input())):
    n = int(input())
    a = list(map(int, input().split()))
    exist = [0] * (2 * n + 2)
    lcms = []
    for x in a:
        for j in range(len(lcms)):
            lcms[j] = lcms[j] * x // gcd(lcms[j], x)
        lcms.append(x)
        nlcms = []
        for x in lcms:
            if x < len(exist) and (not nlcms or nlcms[-1] != x):
                nlcms.append(x)
        lcms = nlcms
        for x in lcms:
            exist[x] = 1
    for x in range(1, len(exist)):
        if not exist[x]:
            print(x)
            break