This book is designed for use by students with a wide range of ability and maturity. The stronger the students, the harder the exercises that can be assigned. The book can be used for one-quarter, two-quarter, or one-semester course depending on how much material is used. Combinatorical reasoning underlies all analysis of computer systems. It plays a similar role in discrete operations research problems and in finite probability. This book teaches students in the mathematical sciences how to reason and model combinatorically. It seeks to develop proficiency in basic discrete math problem solving in the way that a calculus textbook develops proficiency in basic analysis problem solving. The three principle aspects of combinatorical reasoning emphasized in this book are: the systematic analysis of different possibilities, the exploration of the logical structure of a problem (e.g. finding manageable subpieces or first solving the problem with three objects instead of n), and ingenuity. Although important uses of combinatorics in computer science, operations research, and finite probability are mentioned, these applications are often used solely for motivation. Numerical examples involving the same concepts use more interesting settings such as poker probabilities or logical games.