HTML & JS
/* 
 Game Description-
 The game starts with a number- 'n' and the player to move
 divides the number- 'n' with the primes- 2, 3, 6 and then 
 takes the floor. If the integer becomes 0, it is removed. 
 The last player to move wins. Which player wins the game?

 A Dynamic Programming (Memoization-based) approach to 
 calculate Grundy Number and Mex
*/
#include<bits/stdc++.h>
using namespace std;

// A Function to calculate Mex of all the values in that set
// This function remains same 
int calculateMex (unordered_set<int> Set)
{
	int Mex = 0;
	
	while (Set.find (Mex) != Set.end())
		Mex++;
	
	return (Mex);
}

// A function to Compute Grundy Number of 'n'
// Only this function varies according to the game
int calculateGrundy (int n, int Grundy[])
{
	if (n == 0)
		return (0);
	
	if (Grundy[n] != -1)
		return (Grundy[n]);
	
	unordered_set<int> Set; // A Hash Table
	
	Set.insert (calculateGrundy (n/2, Grundy));
	Set.insert (calculateGrundy (n/3, Grundy));
	Set.insert (calculateGrundy (n/6, Grundy));
	
	// Store the result
	Grundy[n] = calculateMex (Set);	
	return (Grundy[n]);
}

// Driver program to test above functions
int main()
{
	int n = 10;	
	
	// An array to cache the sub-problems so that
	// re-computation of same sub-problems is avoided
	int Grundy [n+1];
	memset (Grundy, -1, sizeof (Grundy));
	printf ("%d", calculateGrundy (n, Grundy));
	
	return (0);
}

Generated URL:

Output:

0
Report Bug