http://acm.hust.edu.cn/vjudge/contest/view.action?cid=32290#problem/C
// File Name: uvala3720.cpp
// Author: bo_jwolf
// Created Time: 2013年09月28日 星期六 18:58:58
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std;
const int maxn = 305 ;
int gcd[ maxn ][ maxn ] ;
int Gcd( int a , int b )
{
return b == 0 ? a : Gcd( b , a % b ) ;
}
int main()
{
for( int i = 1 ; i < maxn ; ++i )
{
for( int j = i ; j < maxn ; ++j )
{
gcd[ i ][ j ] = Gcd( i , j ) ;
}
}
int n , m , temp;
long long int ans ;
while( scanf( "%d%d" , &n , &m ) != EOF )
{
if( !n && !m )
{
break ;
}
ans = 0 ;
if( n > m )
swap( n , m ) ;
for( int i = 1 ; i < n ;++i )
{
for( int j = i ; j < m ; ++j )
{
if( gcd[ i ][ j ] <= 2 )
{
if( i == j )
{
temp = ( n - i ) * ( m - j ) ;
if( gcd[ i ][ j ] == 1 )
{
ans += temp ;
}
else
{
ans -= temp ;
}
}
else
{
temp = ( n - i ) * ( m - j ) ;
if( i < m && j < n )
{
temp += ( m - i ) * ( n - j ) ;
}
if( gcd[ i ][ j ] == 1 )
{
ans += temp ;
}
else
{
ans -= temp ;
}
}
}
}
}
ans *= 2 ;
printf( "%lld\n" , ans ) ;
}
return 0;
}