If anyone thinks answering this question would be disruptive to the contest (even though it closed last week) let me know and I, or somebody, will take this down.
Important note: according to the rules, our program need not know the specifics of the game, it just declares the winner assuming perfect play. Another thing that might make understanding the puzzle easier: Every time a player takes a turn, they will always be removing coins from the larger pile, in an amount that is some multiple of the smaller pile. This means there are plenty of occasions where the current player has no choice in the matter and makes what I call a "forced" move.
So let's build out an example where one pile has 5 coins
Any time we have N dividing into M, we know the 1st player (or current player) would win in a single move. From there, let us assume that we have (through some process) solved for all M < N. Each case will either predict the 1st player winning or the second. The next block of cases, where N < M < 2N, we know the active player has one option and must make a forced move. So the case [5,6] will have to become [5,1], it's just moving 5 steps up on our chart. We just have to flip the prediction for who would win, because there is one more turn involved. Moving beyond where M > 2N, the current player does have a choice. So [5,11] can become [5,6] or [5,1]. Since we know they have opposite predictions, we know the active player can always choose one in his favor.
The real lesson from this is:
Any time a player can make a choice, they can win the game!
Which has big consequences
We never need create a program that must branch out to solve for possible combinations. So far as I can tell, we do still need to solve for all of those "forced" moves, though. Here is my Excel VBA code verbatim. It's a picture... so sorry if you wanted to copy the text. It's not that complicated, anyway.
It's funny that the only tag this question had was "combinatorics" and it doesn't even need them.