#include <bits/stdc++.h>
const int P = (1 << 30) - 1;
int a, b, c, p[2005], vis[2005];
std::unordered_map<long long, int> mmp[2005];
void sieve(int n) {
  vis[0] = vis[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!vis[i]) p[++*p] = i;
    for (int j = 1; j <= *p && i * p[j] <= n; ++j) {
      vis[i * p[j]] = 1;
      if (i % p[j] == 0) break;
    }
  }
}
int dp(int kk1, int kk2, int kk3, int pid) {
  if (pid == 0) return 1;
  long long ha = 1ll * kk1 * (a + 1) * (a + 1) + 1ll * kk2 * (a + 1) + kk3;
  if (mmp[pid].count(ha)) return mmp[pid][ha];
  int ans = 0;
  int k1 = 1, k2 = 1, k3 = 1, k4 = 0;
  while (k1 <= kk1) {
    k2 = 1;
    int k5 = 0;
    while (k2 <= kk2) {
      k3 = 1;
      int k6 = 0;
      while (k3 <= kk3) {
        (ans +=
         1ll * dp(kk1 / k1, kk2 / k2, kk3 / k3, pid - 1) * (k4 + k5 + k6 + 1) &
         P) &= P;
        k3 *= p[pid], ++k6;
      }
      k2 *= p[pid], ++k5;
    }
    k1 *= p[pid], ++k4;
  }
  return mmp[pid][ha] = ans;
}
int main() {
  scanf("%d%d%d", &a, &b, &c);
  if (a < b) a ^= b ^= a ^= b;
  if (a < c) a ^= c ^= a ^= c;
  sieve(a);
  printf("%d\n", dp(a, b, c, *p));
  return 0;
}
