def format_veelterm(v: list, p: int) -> str:
    if len(v) == 0:
        return "0"
    graad = len(v) - 1
    termen = []
    for i, c in enumerate(v):
        c = c % p
        if c == 0:
            continue
        macht = graad - i
        if macht == 0:
            term = f"{c}"
        else:
            term = f"{c}x" if c > 1 else "x"
            if macht > 1:
                term += f"^{macht}"
        termen.append(term)
    return " + ".join(termen)

def plus(v_1: list, v_2: list, p: int) -> list:
    l = max(len(v_1), len(v_2))
    v_1 = [0] * (l - len(v_1)) + v_1
    v_2 = [0] * (l - len(v_2)) + v_2
    som = [(j + v_2[i]) % p for i, j in enumerate(v_1)]
    while len(som) > 0 and som[0] == 0:
        som.pop(0)
    return som

def factor(v: list, f: int, p: int) -> list:
    v = [f * i % p for i in v]
    while len(v) > 0 and v[0] == 0:
        v.pop(0)
    return v

def maal_x_tot_de_macht_k(v: list, k: int) -> list:
    return v + [0] * k

def maal(v_1: list, v_2: list, p: int) -> list:
    v = [0]
    k = len(v_1) - 1
    for j in v_1:
        v = plus(v, factor(maal_x_tot_de_macht_k(v_2, k), j, p), p)
        k -= 1
    return v