Problem: Professional sport is more than hard work. It also is the equipment, designed by top engineers. As an example, let's take tennis. Not only should you be in great shape, you also need an excellent racket! In this problem your task is to contribute to the development of tennis and to help to design a revolutionary new concept of a racket!

The concept is a triangular racket. Ant it should be not just any triangle, but a regular one. As soon as you've chosen the shape, you need to stretch the net. By the time you came the rocket had n holes drilled on each of its sides. The holes divide each side into equal n + 1 parts. At that, the m closest to each apex holes on each side are made for better ventilation only and you cannot stretch the net through them. The next revolutionary idea as to stretch the net as obtuse triangles through the holes, so that for each triangle all apexes lay on different sides. Moreover, you need the net to be stretched along every possible obtuse triangle. That's where we need your help — help us to count the number of triangles the net is going to consist of.

Two triangles are considered to be different if their pictures on the fixed at some position racket are different.

Input

The first and the only input line contains two integers n, m <image>.

Output

Print a single number — the answer to the problem.

Examples

Input

3 0


Output

9


Input

4 0


Output

24


Input

10 1


Output

210


Input

8 4


Output

0

Note

For the following picture n = 8, m = 2. White circles are the holes for ventilation, red circles — holes for net stretching. One of the possible obtuse triangles is painted red. 

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T min(T &a, T &b) {
  return a < b ? a : b;
}
template <class T>
inline T max(T &a, T &b) {
  return a > b ? a : b;
}
template <class T>
void read(T &x) {
  char ch;
  while ((ch = getchar()) && !isdigit(ch))
    ;
  x = ch - '0';
  while ((ch = getchar()) && isdigit(ch)) x = x * 10 + ch - '0';
}
struct point {
  int x, y;
  point() {}
  point(int _x, int _y) : x(_x), y(_y) {}
};
int n, m, l;
long long ans;
int main() {
  read(n), read(m);
  l = n + 1;
  int c;
  for (int j = m + 1; j <= n - m; j++) {
    for (int i = m + 1; i <= n - m; i++) {
      int x = j * (j * 2 - l * 3) + l * l, y = l - j, z = l + j;
      if (i == m + 1)
        c = max((x + z * i) / (i + y), m);
      else
        while ((c + 1) * (i + y) <= x + z * i) c++;
      if (c + 1 <= n - m)
        ans += (long long)(n - m - c);
      else
        break;
    }
  }
  printf("%lld\n", ans * 3LL);
}