#include <iostream>#include <sstream>#include <string>#include <vector>#include <deque>#include <queue>#include <set>#include <map>#include <algorithm>#include <functional>#include <utility>#include <cmath>#include <cstdlib>#include <ctime>#include <cstring>#include <cstdio>#include <list>#define pb push_back#define mp make_pairusing namespace std;const int N = 1000000 ;long long dp[N+1] ;int u[N+1] , sum[N+1];bool visit[N+1] ;vector<int> prime ;vector<int> use ;int m ;void getMobi(){ prime.clear() ; u[1] = 1 ; memset(visit,false,sizeof(visit)) ; for (int i = 2 ; i <= N ; i++){ if (!visit[i]){ prime.push_back(i) ; u[i] = -1 ; } for (int j = 0 ; j < prime.size() ; j++){ if ((long long)prime[j]*i > N) break ; visit[prime[j]*i] = true ; if (i%prime[j]==0){ u[prime[j]*i] = 0 ; break ; } u[prime[j]*i] = -u[i] ; } } sum[0] = 0 ; for (int i = 1 ; i <= N ; i++) sum[i] = sum[i-1] + u[i] ;}long long gcd(int x,int y){ if (x > y) return gcd(y,x); long long ret = 0 ; for (int i = x , j ; i > 0 ; i = j){ int tx = x / i , ty = y / i ; j = max(x / (tx+1) , y / (ty+1)) ; ret += (long long)tx * ty * (sum[i]-sum[j]); } return ret;}long long gcd(int x,int y,int z){ if (x > y) return gcd(y,x,z) ; if (x > z) return gcd(z,x,y) ; long long ret = 0 ; for (int i = x , j ; i > 0 ; i = j){ int tx = x / i , ty = y / i , tz = z / i ; j = max(x / (tx+1) , max(y / (ty+1) , z/(tz+1))) ; ret += (long long)tx * ty * tz * (sum[i]-sum[j]); } return ret ;}int main(){ int L,H,W; getMobi(); while (~scanf("%d%d%d",&L,&W,&H)){ long long ans = 0 ; L--; W--; H--; ans += 3 ; ans += gcd(L,W); ans += gcd(W,H); ans += gcd(L,H); ans += gcd(L,H,W) ; cout<<ans<<endl; } return 0 ;}


