A discrete mathematics and theory of algorithms course has more than one purpose. Students should learn a particular set of mathematical facts and how to apply them; more importantly, such a course should teach students how to think logically and mathematically. To achieve these goals, this text stresses mathematical reasoning and the different ways problems are solved. Two important themes are interwoven in this text: inductions and recursions and counting. A successful discrete mathematics and theory of algorithms course should carefully blend and balance two these themes. In the lecture materials, we used a number of books, among which we will single out the wonderful book by [1]. In the second part of the lecture notes, we co...