There are two players A and B who are interested in playing a game of numbers. In each move a player pick two distinct number, let’s say *a1* and *a2* and then replace all *a2* by *a1* or *a1* by *a2*. They stop playing game if any one of them is unable to pick two number and the player who is unable to pick two distinct number in an array, looses the game. First player always move first and then second. Task is to find which player wins.

Examples:

Input : arr[] = { 1, 3, 3, 2,, 2, 1 } Output : Player 2 wins Explanation: First plays always looses irrespective of the numbers chosen by him. For example, say first player picks ( 1 & 3) replace all 3 by 1 Now array Become { 1, 1, 1, 2, 2, 1 } Then second player picks ( 1 2 ) either he replace 1 by 2 or 2 by 1 Array Become { 1, 1, 1, 1, 1, 1 } Now first player is not able to choose. Input : arr[] = { 1, 2, 1, 2 } Output : Player 1 wins

From above examples, we can observe that if number of count of distinct element is even, first player always wins. Else second player wins.

Lets take an another example :

int arr[] = 1, 2, 3, 4, 5, 6

Here number of distinct element is even(n). If player 1 pick any two number lets say (4, 1), then we left with n-1 distinct element. So player second left with n-1 distinct element. This precess go on until distinct element become 1. Here **n = 6**

Player : P1 p2 P1 p2 P1 P2 distinct : [n, n-1, n-2, n-3, n-4, n-5 ] "At this point no distinct element left, so p2 is unable to pick two Dis element."

Below c++ implementation of above idea :

// CPP program for Game of Replacement #include <bits/stdc++.h> using namespace std; // Function return which player win the game int playGame(int arr[], int n) { // Create hash that will stores // all distinct element unordered_set<int> hash; // Traverse an array element for (int i = 0; i < n; i++) hash.insert(arr[i]); return (hash.size() % 2 == 0 ? 1 : 2); } // Driver Function int main() { int arr[] = { 1, 1, 2, 2, 2, 2 }; int n = sizeof(arr) / sizeof(arr[0]); cout << "Player " << playGame(arr, n) << " Wins" << endl; return 0; }

Output:

Player 1 Wins

Time Complexity : O(n)

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.