Source: https://cse.buffalo.edu/~xinhe/cse191/Homework/Mid1b-solution.pdf