Problem: The Little Elephant is playing with the Cartesian coordinates' system. Most of all he likes playing with integer points. The Little Elephant defines an integer point as a pair of integers (x; y), such that 0 ≤ x ≤ w and 0 ≤ y ≤ h. Thus, the Little Elephant knows only (w + 1)·(h + 1) distinct integer points.

The Little Elephant wants to paint a triangle with vertexes at integer points, the triangle's area must be a positive integer. For that, he needs to find the number of groups of three points that form such triangle. At that, the order of points in a group matters, that is, the group of three points (0;0), (0;2), (2;2) isn't equal to the group (0;2), (0;0), (2;2).

Help the Little Elephant to find the number of groups of three integer points that form a nondegenerate triangle with integer area.

Input

A single line contains two integers w and h (1 ≤ w, h ≤ 4000).

Output

In a single output line print an integer — the remainder of dividing the answer to the problem by 1000000007 (109 + 7).

Examples

Input

2 1


Output

36


Input

2 2


Output

240

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int N = 4005, M = 1000000007;
int w, h;
bool flag[N][N];
long long ans;
int main() {
  scanf("%d%d", &w, &h);
  for (int i = 0; i <= w; i++)
    for (int j = 0; j <= h; j++) {
      long long even_num1, even_num2, temp_num1, temp_num2, t1, t2, t3, t4,
          temp;
      even_num1 = (w - i) >> 1;
      even_num2 = (h - j) >> 1;
      temp_num1 = ((h + 2) >> 1);
      temp_num2 = ((h + 1) >> 1);
      if (j & 1) {
        temp = temp_num1;
        temp_num1 = temp_num2;
        temp_num2 = temp;
      }
      t1 = even_num1 * temp_num1 + even_num2;
      t2 = even_num1 * temp_num2 + (h - j - even_num2);
      t3 = (w - i - even_num1) * temp_num1;
      t4 = (w - i - even_num1) * temp_num2;
      ans =
          (ans + (t1 * (t1 - 1) >> 1) + t1 * (t2 + t3 + t4) +
           (t4 * (t4 - 1) >> 1) + (t2 * (t2 - 1) >> 1) + (t3 * (t3 - 1) >> 1)) %
          M;
    }
  memset(flag, 0, sizeof(flag));
  for (int i = 0; i <= w; i++)
    for (int j = 0; j <= h; j++)
      if (!flag[i][j]) {
        if (!i && !j) continue;
        long long ii = i, jj = j, t = 1;
        while (ii + i <= w && jj + j <= h) {
          ii += i;
          jj += j;
          t++;
          flag[ii][jj] = 1;
          long long temp = ((w - ii + 1) * (h - jj + 1) * (t - 1)) % M;
          if (i && j) temp *= 2;
          ans = (ans - temp) % M;
        }
      }
  ans = ((ans + M) * 6) % M;
  printf("%I64d\n", ans);
  return 0;
}