#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) { cerr << "\n"; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " : " << a << " | ";
  err(++it, args...);
}
template <typename T>
T gcd(T a, T b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
template <typename T>
T pow(T a, T b, long long int m) {
  T ans = 1;
  while (b > 0) {
    if (b % 2 == 1) ans = ((ans % m) * (a % m)) % m;
    b /= 2;
    a = ((a % m) * (a % m)) % m;
  }
  return ans % m;
}
template <typename T>
void tracepp(T &a) {
  {
    string _s = "a.ff, a.ss";
    replace(_s.begin(), _s.end(), ',', ' ');
    stringstream _ss(_s);
    istream_iterator<string> _it(_ss);
    err(_it, a.first, a.second);
  };
}
template <typename T>
void tracev(T &a) {
  for (auto &i : a) {
    cerr << i << ' ';
  }
  cerr << '\n';
}
template <typename T>
void tracevv(T &a) {
  for (auto &i : a) {
    tracev(i);
  }
}
template <typename T>
void tracevp(T &a) {
  for (auto &i : a) {
    {
      string _s = "i.ff, i.ss";
      replace(_s.begin(), _s.end(), ',', ' ');
      stringstream _ss(_s);
      istream_iterator<string> _it(_ss);
      err(_it, i.first, i.second);
    };
  }
  cerr << '\n';
}
int main() {
  int r, c;
  bool sp = false;
  cin >> r >> c;
  if (c < r) {
    swap(r, c);
    sp = true;
  }
  vector<vector<long long int> > a(r, vector<long long int>(c, 1));
  long long int cc = 1;
  for (long long int i = (long long int)(0); i < (long long int)(r); i++) {
    for (long long int j = (long long int)(0); j < (long long int)(c); j++) {
      a[i][j] *= cc;
    }
    cc++;
  }
  for (long long int i = (long long int)(0); i < (long long int)(c); i++) {
    for (long long int j = (long long int)(0); j < (long long int)(r); j++) {
      a[j][i] *= cc;
    }
    cc++;
  }
  bool ans = true;
  set<long long int> st;
  for (long long int i = (long long int)(0); i < (long long int)(r); i++) {
    long long int g = a[i][0];
    for (long long int j = (long long int)(0); j < (long long int)(c); j++) {
      g = gcd(g, a[i][j]);
    }
    if (st.find(g) != st.end()) {
      ans = false;
      break;
    }
    st.insert(g);
  }
  for (long long int i = (long long int)(0); i < (long long int)(c); i++) {
    long long int g = a[0][i];
    for (long long int j = (long long int)(0); j < (long long int)(r); j++) {
      g = gcd(g, a[j][i]);
    }
    if (st.find(g) != st.end()) {
      ans = false;
      break;
    }
    st.insert(g);
  }
  if (!ans) {
    cout << "0\n";
  } else {
    if (sp) {
      for (long long int i = (long long int)(0); i < (long long int)(c); i++) {
        for (long long int j = (long long int)(0); j < (long long int)(r);
             j++) {
          cout << a[j][i] << ' ';
        }
        cout << '\n';
      }
    } else {
      for (long long int i = (long long int)(0); i < (long long int)(r); i++) {
        for (long long int j = (long long int)(0); j < (long long int)(c);
             j++) {
          cout << a[i][j] << ' ';
        }
        cout << '\n';
      }
    }
  }
  return 0;
}
