def disperse(n, k):
    """
    Disperses a number n between m different groups.
    The sum of all groups must be smaller or equal to n.
    (Yes, the sum can be smaller - that is, a group of zeros is also an answer)

    The answer will have (n + k)! / (n! k!) groups.

    :param n: The number to disperse between groups
    :type n: int
    :param k: The amount of groups to disperse n into
    :type k: int

    :return: All of the options of dispersion - length of (n + k)! / (n! k!)
    :rtype: list of tuples (of ints)
    """
    options = [()]
    for group in range(k):
        new_options = []
        for option in options:
            remainder = n - sum(option)
            for i in range(remainder + 1):
                new_options.append(option + (i,))
        del options
        options = new_options
    return options
