← Home
package main

import (
	"fmt"
	"sort"
)

func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func main() {
	var a, b, c int
	fmt.Scan(&a, &b, &c)

	arr := []int{a, b, c}
	sort.Ints(arr)
	a, b, c = arr[0], arr[1], arr[2]

	mu := make([]int, c+1)
	primes := make([]int, 0, c+1)
	isPrime := make([]bool, c+1)
	for i := 2; i <= c; i++ {
		isPrime[i] = true
	}
	mu[1] = 1
	for i := 2; i <= c; i++ {
		if isPrime[i] {
			primes = append(primes, i)
			mu[i] = -1
		}
		for _, p := range primes {
			if i*p > c {
				break
			}
			isPrime[i*p] = false
			if i%p == 0 {
				mu[i*p] = 0
				break
			}
			mu[i*p] = -mu[i]
		}
	}

	H := make([]uint32, c+1)
	for x := 1; x <= c; x++ {
		var sum uint32
		for k := 1; k <= x; k++ {
			sum += uint32(x / k)
		}
		H[x] = sum
	}

	F := make([]uint32, c+1)
	for d := 1; d <= c; d++ {
		if mu[d] == 1 {
			F[d] = H[c/d]
		} else if mu[d] == -1 {
			F[d] = -H[c/d]
		}
	}

	ab := a * b
	g := make([]uint32, ab+1)
	for d := 1; d <= c; d++ {
		if F[d] != 0 {
			for k := d; k <= ab; k += d {
				g[k] += F[d]
			}
		}
	}

	var ans uint32
	for x := 1; x <= a; x++ {
		for y := 1; y <= b; y++ {
			if gcd(x, y) == 1 {
				ans += uint32(a/x) * uint32(b/y) * g[x*y]
			}
		}
	}

	fmt.Println(ans & 0x3FFFFFFF)
}