Source: http://math.northwestern.edu/~mlerma/problem_solving/putnam/training-poly.pdf