/*
TASK: rtri
LANG:C++
*/

#include <iostream>

using namespace std;

int n, m;
long result;
int x, y;
int multipl[2] = {0};
int i, j;
int buf;

int change[2];
	

int cases()
{
	
	if (change[0] > 0 && change[1] > 0)
		if (x + change[0] < n && y + change[1] < m)	return 1;

		else return 0;
	if (change[0] > 0 && change[1] < 0)
		if (x + change[0] < n && y + change[1] >= 0) return 1;
		else return 0;
	if (change[0] < 0 && change[1] > 0)
		if (x + change[0] >= 0 && y + change[1] < m) return 1;
		else return 0;
	if (change[0] < 0 && change[1] < 0)
		if (x + change[0] >= 0 && y + change[1] >= 0) return 1;
		else return 0;
	return 1;
}			

void func ()
{
	int xsafe, ysafe;
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
		{
			x = i;
			y = j;

			while (cases())
			{
				x += change[0];
				y += change[1];
				xsafe = x;
				ysafe = y;
				buf = change[0];
				change[0] = change[1];
				change[1] = -buf;
			
				while (cases())
				{
					x += change[0];
					y += change[1];
					result++;
				}

				buf = change[0];
				change[0] = -change[1];
				change[1] = buf;
				x = xsafe;
				y = ysafe;
			}
				if (multipl[0]*multipl[1])
				cout << i << "===" << j <<"   " << change[0] << "===" << change[1] << endl << endl ;
			result += multipl[0] * multipl[1];
	}
}

int main ()
{
	cin >> n >> m;
	n++;
	m++;
	result = m*(m-1)*n*(n-1);
	for (change[0] = 1; change[0] < n; change[0]++)
		for (change[1] = 1; change[1] < m; change[1]++)	
		{
			func ();
			change[0] *= -1;
			func ();
			change[1] *= -1;
			func ();
			change[0] *= -1;
			func ();
			change[1] *= -1;
		}
	cout << result << "\n";
	return 0;
}