# Coin game winner where every player has three choices

A and B are playing a game. At the beginning there are** n** coins. Given two more numbers x and y. In each move a player can pick x or y or l coins. A always starts the game. The player who picks the last coin wins the game. For a given value of n, find whether A will win the game or not if both are playing optimally.

Examples:

Input : n = 5, x = 3, y = 4 Output : A There are 5 coins, every player can pick 1 or 3 or 4 coins on his/her turn. A can win by picking 3 coins in first chance. Now 2 coins will be left so B will pick one coin and now A can win by picking the last coin. Input : 2 3 4 Output : B

Let us take few example values of n for x = 3, y = 4.

n = 0 A can not pick any coin so he losses

n = 1 A can pick 1 coin and win the game

n = 2 A can pick only 1 coin. Now B will pick 1 coin and win the game

n = 3 4 A will win the game by picking 3 or 4 coins

n = 5, 6 A will choose 3 or 4 coins. Now B will have to choose from 2 coins so A will win.

We can observe that A wins game for n coins only when it loses for coins n-1, n-x and n-y.

## C++

`// CPP program to find winner of game ` `// if player can pick 1, x, y coins ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// To find winner of game ` `bool` `findWinner(` `int` `x, ` `int` `y, ` `int` `n) ` `{ ` ` ` `// To store results ` ` ` `int` `dp[n + 1]; ` ` ` ` ` `// Initial values ` ` ` `dp[0] = ` `false` `; ` ` ` `dp[1] = ` `true` `; ` ` ` ` ` `// Computing other values. ` ` ` `for` `(` `int` `i = 2; i <= n; i++) { ` ` ` ` ` `// If A losses any of i-1 or i-x ` ` ` `// or i-y game then he will ` ` ` `// definitely win game i ` ` ` `if` `(i - 1 >= 0 and !dp[i - 1]) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - x >= 0 and !dp[i - x]) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - y >= 0 and !dp[i - y]) ` ` ` `dp[i] = ` `true` `; ` ` ` ` ` `// Else A loses game. ` ` ` `else` ` ` `dp[i] = ` `false` `; ` ` ` `} ` ` ` ` ` `// If dp[n] is true then A will ` ` ` `// game otherwise he losses ` ` ` `return` `dp[n]; ` `} ` ` ` `// Driver program to test findWinner(); ` `int` `main() ` `{ ` ` ` `int` `x = 3, y = 4, n = 5; ` ` ` `if` `(findWinner(x, y, n)) ` ` ` `cout << ` `'A'` `; ` ` ` `else` ` ` `cout << ` `'B'` `; ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Java

`// Java program to find winner of game ` `// if player can pick 1, x, y coins ` `import` `java.util.Arrays; ` ` ` `public` `class` `GFG { ` ` ` ` ` `// To find winner of game ` ` ` `static` `boolean` `findWinner(` `int` `x, ` `int` `y, ` `int` `n) ` ` ` `{ ` ` ` `// To store results ` ` ` `boolean` `[] dp = ` `new` `boolean` `[n + ` `1` `]; ` ` ` ` ` `Arrays.fill(dp, ` `false` `); ` ` ` ` ` `// Initial values ` ` ` `dp[` `0` `] = ` `false` `; ` ` ` `dp[` `1` `] = ` `true` `; ` ` ` ` ` `// Computing other values. ` ` ` `for` `(` `int` `i = ` `2` `; i <= n; i++) { ` ` ` ` ` `// If A losses any of i-1 or i-x ` ` ` `// or i-y game then he will ` ` ` `// definitely win game i ` ` ` `if` `(i - ` `1` `>= ` `0` `&& dp[i - ` `1` `] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - x >= ` `0` `&& dp[i - x] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - y >= ` `0` `&& dp[i - y] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` ` ` `// Else A loses game. ` ` ` `else` ` ` `dp[i] = ` `false` `; ` ` ` `} ` ` ` ` ` `// If dp[n] is true then A will ` ` ` `// game otherwise he losses ` ` ` `return` `dp[n]; ` ` ` `} ` ` ` ` ` `// Driver program to test findWinner(); ` ` ` `public` `static` `void` `main(String args[]) ` ` ` `{ ` ` ` `int` `x = ` `3` `, y = ` `4` `, n = ` `5` `; ` ` ` `if` `(findWinner(x, y, n) == ` `true` `) ` ` ` `System.out.println(` `'A'` `); ` ` ` `else` ` ` `System.out.println(` `'B'` `); ` ` ` `} ` `} ` `// This code is contributed by Sumit Ghosh ` |

*chevron_right*

*filter_none*

## Python3

`# Python3 program to find winner of game ` `# if player can pick 1, x, y coins ` ` ` `# To find winner of game ` `def` `findWinner(x, y, n): ` ` ` ` ` `# To store results ` ` ` `dp ` `=` `[` `0` `for` `i ` `in` `range` `(n ` `+` `1` `)] ` ` ` ` ` `# Initial values ` ` ` `dp[` `0` `] ` `=` `False` ` ` `dp[` `1` `] ` `=` `True` ` ` ` ` `# Computing other values. ` ` ` `for` `i ` `in` `range` `(` `2` `, n ` `+` `1` `): ` ` ` ` ` `# If A losses any of i-1 or i-x ` ` ` `# or i-y game then he will ` ` ` `# definitely win game i ` ` ` `if` `(i ` `-` `1` `>` `=` `0` `and` `not` `dp[i ` `-` `1` `]): ` ` ` `dp[i] ` `=` `True` ` ` `elif` `(i ` `-` `x >` `=` `0` `and` `not` `dp[i ` `-` `x]): ` ` ` `dp[i] ` `=` `True` ` ` `elif` `(i ` `-` `y >` `=` `0` `and` `not` `dp[i ` `-` `y]): ` ` ` `dp[i] ` `=` `True` ` ` ` ` `# Else A loses game. ` ` ` `else` `: ` ` ` `dp[i] ` `=` `False` ` ` ` ` `# If dp[n] is true then A will ` ` ` `# game otherwise he losses ` ` ` `return` `dp[n] ` ` ` `# Driver Code ` `x ` `=` `3` `; y ` `=` `4` `; n ` `=` `5` `if` `(findWinner(x, y, n)): ` ` ` `print` `(` `'A'` `) ` `else` `: ` ` ` `print` `(` `'B'` `) ` ` ` `# This code is contributed by Azkia Anam ` |

*chevron_right*

*filter_none*

## C#

`// C# program to find winner of game ` `// if player can pick 1, x, y coins ` `using` `System; ` ` ` `public` `class` `GFG { ` ` ` ` ` `// To find winner of game ` ` ` `static` `bool` `findWinner(` `int` `x, ` `int` `y, ` `int` `n) ` ` ` `{ ` ` ` ` ` `// To store results ` ` ` `bool` `[] dp = ` `new` `bool` `[n + 1]; ` ` ` ` ` `for` `(` `int` `i = 0; i < n+1; i++) ` ` ` `dp[i] =` `false` `; ` ` ` ` ` `// Initial values ` ` ` `dp[0] = ` `false` `; ` ` ` `dp[1] = ` `true` `; ` ` ` ` ` `// Computing other values. ` ` ` `for` `(` `int` `i = 2; i <= n; i++) ` ` ` `{ ` ` ` ` ` `// If A losses any of i-1 or i-x ` ` ` `// or i-y game then he will ` ` ` `// definitely win game i ` ` ` `if` `(i - 1 >= 0 && dp[i - 1] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - x >= 0 && dp[i - x] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` `else` `if` `(i - y >= 0 && dp[i - y] == ` `false` `) ` ` ` `dp[i] = ` `true` `; ` ` ` ` ` `// Else A loses game. ` ` ` `else` ` ` `dp[i] = ` `false` `; ` ` ` `} ` ` ` ` ` `// If dp[n] is true then A will ` ` ` `// game otherwise he losses ` ` ` `return` `dp[n]; ` ` ` `} ` ` ` ` ` `// Driver program to test findWinner(); ` ` ` `public` `static` `void` `Main() ` ` ` `{ ` ` ` `int` `x = 3, y = 4, n = 5; ` ` ` ` ` `if` `(findWinner(x, y, n) == ` `true` `) ` ` ` `Console.WriteLine(` `'A'` `); ` ` ` `else` ` ` `Console.WriteLine(` `'B'` `); ` ` ` `} ` `} ` ` ` `// This code is contributed by vt_m. ` |

*chevron_right*

*filter_none*

## PHP

`<?php ` `// PHP program to find winner of game ` `// if player can pick 1, x, y coins ` ` ` `// To find winner of game ` `function` `findWinner( ` `$x` `, ` `$y` `, ` `$n` `) ` `{ ` ` ` ` ` `// To store results ` ` ` `$dp` `= ` `array` `(); ` ` ` ` ` `// Initial values ` ` ` `$dp` `[0] = false; ` ` ` `$dp` `[1] = true; ` ` ` ` ` `// Computing other values. ` ` ` `for` `(` `$i` `= 2; ` `$i` `<= ` `$n` `; ` `$i` `++) ` ` ` `{ ` ` ` ` ` `// If A losses any of i-1 or i-x ` ` ` `// or i-y game then he will ` ` ` `// definitely win game i ` ` ` `if` `(` `$i` `- 1 >= 0 ` `and` `!` `$dp` `[` `$i` `- 1]) ` ` ` `$dp` `[` `$i` `] = true; ` ` ` `else` `if` `(` `$i` `- ` `$x` `>= 0 ` `and` `!` `$dp` `[` `$i` `- ` `$x` `]) ` ` ` `$dp` `[` `$i` `] = true; ` ` ` `else` `if` `(` `$i` `- ` `$y` `>= 0 ` `and` `!` `$dp` `[` `$i` `- ` `$y` `]) ` ` ` `$dp` `[` `$i` `] = true; ` ` ` ` ` `// Else A loses game. ` ` ` `else` ` ` `$dp` `[` `$i` `] = false; ` ` ` `} ` ` ` ` ` `// If dp[n] is true then A will ` ` ` `// game otherwise he losses ` ` ` `return` `$dp` `[` `$n` `]; ` `} ` ` ` `// Driver program to test findWinner(); ` ` ` `$x` `= 3; ` `$y` `= 4; ` `$n` `= 5; ` ` ` `if` `(findWinner(` `$x` `, ` `$y` `, ` `$n` `)) ` ` ` `echo` `'A'` `; ` ` ` `else` ` ` `echo` `'B'` `; ` ` ` `// This code is contributed by anuj_67. ` `?> ` |

*chevron_right*

*filter_none*

Output:

A

This article is contributed by **nuclode**. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

## Recommended Posts:

- Coin Change | DP-7
- Optimal Strategy for a Game | DP-31
- Count number of ways to reach a given score in a game
- Maximum games played by winner
- Understanding The Coin Change Problem With Dynamic Programming
- Predict the winner of the game | Sprague-Grundy
- Count of numbers between range having only non-zero digits whose sum of digits is N and number is divisible by M
- Ways to form an array having integers in given range such that total sum is divisible by 2
- Sum of XOR of all subarrays
- DP on Trees | Set-3 ( Diameter of N-ary Tree )
- Maximum length subsequence such that adjacent elements in the subsequence have a common factor
- Minimum replacements to make adjacent characters unequal in a ternary string | Set-2
- Find sub-matrix with the given sum
- Count of sub-sets of size n with total element sum divisible by 3