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;
int ar[4010][4010];
int main(int argc, char** argv) {
  long long w, h;
  cin >> w >> h;
  ++w;
  ++h;
  long long evenx = w / 2 + w % 2;
  long long oddx = w / 2;
  long long eveny = h / 2 + h % 2;
  long long oddy = h / 2;
  long long ans = 0;
  ans = (ans + eveny * eveny * eveny) % 1000000007ll;
  ans = (ans * w) % 1000000007ll;
  ans = (ans * w) % 1000000007ll;
  ans = (ans * w) % 1000000007ll;
  long long ans1 = 0;
  ans1 = (ans1 + eveny * eveny * oddy * 3ll) % 1000000007ll;
  ans1 = (ans1 * ((oddx * oddx * oddx) % 1000000007ll +
                  (evenx * evenx * evenx) % 1000000007ll)) %
         1000000007ll;
  ans = (ans + ans1) % 1000000007ll;
  ans1 = 0;
  ans1 = (ans1 + eveny * eveny * oddy * 3ll) % 1000000007ll;
  ans1 = (ans1 * ((oddx * oddx * evenx) % 1000000007ll +
                  (evenx * evenx * oddx) % 1000000007ll)) %
         1000000007ll;
  ans = (ans + ans1) % 1000000007ll;
  ans1 = 0;
  ans1 = (ans1 + eveny * oddy * oddy * 3ll) % 1000000007ll;
  ans1 = (ans1 * ((oddx * oddx * oddx) % 1000000007ll +
                  (evenx * evenx * evenx) % 1000000007ll)) %
         1000000007ll;
  ans = (ans + ans1) % 1000000007ll;
  ans1 = 0;
  ans1 = (ans1 + eveny * oddy * oddy * 3ll) % 1000000007ll;
  ans1 = (ans1 * ((oddx * oddx * evenx) % 1000000007ll +
                  (evenx * evenx * oddx) % 1000000007ll)) %
         1000000007ll;
  ans = (ans + ans1) % 1000000007ll;
  ans1 = 0;
  ans1 = (ans1 + oddy * oddy * oddy) % 1000000007ll;
  ans1 = (ans1 * ((w * w * w) % 1000000007ll)) % 1000000007ll;
  ans = (ans + ans1) % 1000000007ll;
  ans1 = 0;
  ans1 = (w * h) % 1000000007ll;
  ans1 = (ans1 + w * h * (w * h - 1) * 3ll) % 1000000007ll;
  ans = (ans - ans1 + 2ll * 1000000007ll) % 1000000007ll;
  ar[0][0] = 1;
  ans1 = 0;
  for (int i = 0; i < w + 1; ++i)
    for (int j = 0; j < h + 1; ++j)
      if (!ar[i][j]) {
        long long ki = i, kj = j;
        long long n = 0;
        while (ki < w && kj < h) {
          ++n;
          ans1 = (ans1 + (n - 1) * (w - ki) * (h - kj) * 6ll) % 1000000007ll;
          if (ki && kj)
            ans1 = (ans1 + (n - 1) * (w - ki) * (h - kj) * 6ll) % 1000000007ll;
          ar[ki][kj] = 1;
          ki += i;
          kj += j;
        }
      }
  ans = (ans - ans1 + 2ll * 1000000007ll) % 1000000007ll;
  cout << ans << endl;
  return 0;
}