#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:300000000")
#pragma warning(disable : 4800)
using namespace std;
const double pi = 3.1415926535897932384626433832795;
template <class T>
T abs(const T &a) {
  return a >= 0 ? a : -a;
};
template <class T>
T sqr(const T &x) {
  return x * x;
}
int n, m, s;
vector<vector<int> > divisors;
void findDivisors(int x) {
  for (int i = 1; i * i <= x; i++)
    if (x % i == 0) {
      divisors[x].push_back(i);
      if (i * i != x) divisors[x].push_back(x / i);
    }
}
long long f(int h, int w) { return max(n - h + 1, 0) * max(m - w + 1, 0); }
long long findOneGreater() {
  long long ans = 0;
  for (int i = 0; i < (int((divisors[s]).size())); i++) {
    int h = divisors[s][i];
    int w = s / divisors[s][i];
    long long t = f(h, w);
    long long x = h / 2 + w / 2 + (h / 2) * (w / 2);
    ans += t * x;
  }
  return ans;
}
long long findEqual() {
  long long ans = 0;
  for (int i = 0; i < (int((divisors[s]).size())); i++)
    ans += f(divisors[s][i], s / divisors[s][i]);
  return ans;
}
long long findOLOLO() {
  long long ans = 0;
  for (int h = 1; h <= n; h += 2)
    for (int w = 3; h * w < s; w += 2) {
      int rs = (s - h * w) / 2;
      for (int i = 0; i < (int((divisors[rs]).size())); i++) {
        int h2 = divisors[rs][i];
        int w2 = rs / divisors[rs][i];
        if (w2 % 2 == 0 || w2 >= w) continue;
        ans += f(h + h2 * 2, w);
      }
    }
  return ans;
}
int main() {
  if (ifstream("input.txt")) {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  }
  cin >> n >> m >> s;
  if (s % 2 == 0) {
    cout << 0;
    return 0;
  }
  divisors.resize(n * m + 1);
  for (int i = 1; i <= n * m; i++) findDivisors(i);
  long long ans = 0;
  ans += findOneGreater() * 2;
  ans += findEqual();
  ans += findOLOLO() * 2;
  cout << ans;
  cerr << double(clock()) / CLOCKS_PER_SEC << endl;
}
