discrete_mathematics counting permutations combinations generating_functions inclusion_exclusion pigeonhole_principle recurrences graph_theory