This book fills the gap between introductory texts in discrete mathematics and advanced graduate texts in enumerative combinatorics. The text first deals with basic counting principles, compositions and partitions, and generating functions. It then focuses on the structure of permutations, graph enumeration, and extremal combinatorics. Lastly, the book discusses supplemental topics, including error-correcting codes, properties of sequences, and magic squares. The second edition adds a new chapter on analytic combinatorics, new sections on advanced applications of generating functions, and new exercises to all chapters.