The LCMs Must be Large (Codeforces 1166E)
Tags: Math, bitmasks

Dora the explorer has decided to use her money after several years of juicy royalties to go shopping. What better place to shop than Nlogonia?There are $$$n$$$ stores numbered from $$$1$$$ to $$$n$$$ in Nlogonia. The $$$i$$$-th of these stores offers a positive integer $$$a_i$$$.Each day among the last $$$m$$$ days Dora bought a single integer from some of the stores. The same day, Swiper the fox bought a single integer from all the stores that Dora did not buy an integer from on that day.Dora considers Swiper to be her rival, and she considers that she beat Swiper on day $$$i$$$ if and only if the least common multiple of the numbers she bought on day $$$i$$$ is strictly greater than the least common multiple of the numbers that Swiper bought on day $$$i$$$.The least common multiple (LCM) of a collection of integers is the smallest positive integer that is divisible by all the integers in the collection.However, Dora forgot the values of $$$a_i$$$. Help Dora find out if there are positive integer values of $$$a_i$$$ such that she beat Swiper on every day. You don't need to find what are the possible values of $$$a_i$$$ though.Note that it is possible for some values of $$$a_i$$$ to coincide in a solution.

Input: The first line contains integers $$$m$$$ and $$$n$$$ ($$$1\leq m \leq 50$$$, $$$1\leq n \leq 10^4$$$) — the number of days and the number of stores.After this $$$m$$$ lines follow, the $$$i$$$-th line starts with an integer $$$s_i$$$ ($$$1\leq s_i \leq n-1$$$), the number of integers Dora bought on day $$$i$$$, followed by $$$s_i$$$ distinct integers, the indices of the stores where Dora bought an integer on the $$$i$$$-th day. The indices are between $$$1$$$ and $$$n$$$.

Output: Output must consist of a single line containing "possible" if there exist positive integers $$$a_i$$$ such that for each day the least common multiple of the integers bought by Dora is strictly greater than the least common multiple of the integers bought by Swiper on that day. Otherwise, print "impossible".Note that you don't have to restore the integers themselves.

Note: In the first sample, a possible choice for the values of the $$$a_i$$$ is $$$3, 4, 3, 5, 2$$$. On the first day, Dora buys the integers $$$3, 4$$$ and $$$3$$$, whose LCM is $$$12$$$, while Swiper buys integers $$$5$$$ and $$$2$$$, whose LCM is $$$10$$$. On the second day, Dora buys $$$3, 5$$$ and $$$2$$$, whose LCM is $$$30$$$, and Swiper buys integers $$$3$$$ and $$$4$$$, whose LCM is $$$12$$$.

Sample Inputs:
2 5
3 1 2 3
3 3 4 5

10 10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10

Sample Outputs:
possible

impossible

Solution (Python):
import sys
input = sys.stdin.readline

def solve():
    (m, n) = map(int, input().split())
    c = [0] * (n + 1)
    a = [None] * m
    for i in range(m):
        s = map(int, input().split())
        next(s)
        a[i] = list(s)
    for i in range(m):
        for v in a[i]:
            c[v] += 1
        for j in range(i + 1, m):
            for v in a[j]:
                if c[v] > 0:
                    break
            else:
                print('impossible')
                return
        for v in a[i]:
            c[v] -= 1
    print('possible')
solve()

Solution (Python):
(m, n) = map(int, input().split())
s = set(range(1, n + 1))
d = [[None, None] for i in range(m)]
for i in range(m):
    x = list(map(int, input().split()))[1:]
    x = set(x)
    d[i][0] = x
    d[i][1] = s - x
for i in range(m):
    for j in range(i + 1, m):
        (bi, si) = d[i]
        (bj, sj) = d[j]
        if sj.issuperset(bi) and bj.issubset(si):
            print('impossible')
            quit()
print('possible')

Solution (Python):
(m, n) = [int(i) for i in input().split()]
mas = set(range(1, n + 1))
setd = []
sets = []
for i in range(m):
    s = set()
    [s.add(int(j)) for j in input().split()[1:]]
    setd.append(s)
    sets.append(mas.difference(s))
flag = True
for i in range(m):
    for j in range(m):
        if sets[i].issuperset(setd[j]):
            flag = False
            break
if flag:
    print('possible')
else:
    print('impossible')