Computational Discrete Mathematics by Steven Skiena & Sriram Pemmaraju