It is known that fleas in Berland can jump only vertically and horizontally, and the length of the jump is always equal to s centimeters. A flea has found herself at the center of some cell of the checked board of the size n × m centimeters (each cell is 1 × 1 centimeters). She can jump as she wishes for an arbitrary number of times, she can even visit a cell more than once. The only restriction is that she cannot jump out of the board.

The flea can count the amount of cells that she can reach from the starting position (x, y). Let's denote this amount by dx, y. Your task is to find the number of such starting positions (x, y), which have the maximum possible value of dx, y.

Input

The first line contains three integers n, m, s (1 ≤ n, m, s ≤ 106) — length of the board, width of the board and length of the flea's jump.

Output

Output the only integer — the number of the required starting positions of the flea.

Examples

Input

2 3 1000000


Output

6


Input

3 3 2


Output

4
//package timus;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.io.Writer;
import java.math.BigInteger;
import java.sql.Date;
import java.util.AbstractSet;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import java.util.Vector;

public class Abra {
	public static void main(String[] args) throws IOException {
		new Abra().run();
	}

	StreamTokenizer in;
	PrintWriter out;
	boolean oj;
	BufferedReader br;

	void init() throws IOException {
		oj = System.getProperty("ONLINE_JUDGE") != null;
		Reader reader = oj ? new InputStreamReader(System.in) : new FileReader("input.txt");
		Writer writer = oj ? new OutputStreamWriter(System.out) : new FileWriter("output.txt");
		// Reader reader = new InputStreamReader(System.in);
		// Writer writer = new OutputStreamWriter(System.out);
		br = new BufferedReader(reader);
		in = new StreamTokenizer(br);
		out = new PrintWriter(writer);
	}

	long selectionTime = 0;

	void startSelection() {
		selectionTime -= System.currentTimeMillis();
	}

	void stopSelection() {
		selectionTime += System.currentTimeMillis();
	}

	void run() throws IOException {
		long beginTime = System.currentTimeMillis();
		init();
		solve();
		long endTime = System.currentTimeMillis();
		if (!oj) {
			System.out.println("Memory used = " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
			System.out.println("Running time = " + (endTime - beginTime));
			System.out.println("Time of the selection = " + selectionTime);
		}
		out.flush();
	}

	int nextInt() throws IOException {
		in.nextToken();
		return (int) in.nval;
	}

	long nextLong() throws IOException {
		in.nextToken();
		return (long) in.nval;
	}

	String nextString() throws IOException {
		in.nextToken();
		return in.sval;
	}

	double nextDouble() throws IOException {
		in.nextToken();
		return in.nval;
	}

	long fact(long x) {
		long a = 1;
		for (long i = 2; i <= x; i++) {
			a *= i;
		}
		return a;
	}

	long digitSum(String x) {
		long a = 0;
		for (int i = 0; i < x.length(); i++) {
			a += x.charAt(i) - '0';
		}
		return a;
	}

	long digitSum(long x) {
		long a = 0;
		while (x > 0) {
			a += x % 10;
			x /= 10;
		}
		return a;
	}

	long digitMul(long x) {
		long a = 1;
		while (x > 0) {
			a *= x % 10;
			x /= 10;
		}
		return a;
	}

	int digitCubesSum(int x) {
		int a = 0;
		while (x > 0) {
			a += (x % 10) * (x % 10) * (x % 10);
			x /= 10;
		}
		return a;
	}

	double pif(double ax, double ay, double bx, double by) {
		return Math.sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
	}

	long gcd(long a, long b) {
		if (a < b) {
			long c = b;
			b = a;
			a = c;
		}
		while (a % b != 0) {
			a = a % b;
			if (a < b) {
				long c = b;
				b = a;
				a = c;
			}
		}
		return b;
	}

	int gcd(int a, int b) {
		if (a < b) {
			int c = b;
			b = a;
			a = c;
		}
		while (a % b != 0) {
			a = a % b;
			if (a < b) {
				int c = b;
				b = a;
				a = c;
			}
		}
		return b;
	}

	long lcm(long a, long b) throws IOException {
		return a * b / gcd(a, b);
	}

	int lcm(int a, int b) throws IOException {
		return a * b / gcd(a, b);
	}

	int countOccurences(String x, String y) {
		int a = 0, i = 0;
		while (true) {
			i = y.indexOf(x);
			if (i == -1) break;
			a++;
			y = y.substring(i + 1);
		}
		return a;
	}

	int[] findPrimes(int x) {
		boolean[] forErato = new boolean[x - 1];
		List<Integer> t = new Vector<Integer>();
		int l = 0, j = 0;
		for (int i = 2; i < x; i++) {
			if (forErato[i - 2]) continue;
			t.add(i);
			l++;
			j = i * 2;
			while (j < x) {
				forErato[j - 2] = true;
				j += i;
			}
		}
		int[] primes = new int[l];
		Iterator<Integer> iterator = t.iterator();
		for (int i = 0; iterator.hasNext(); i++) {
			primes[i] = iterator.next().intValue();
		}
		return primes;
	}

	int rev(int x) {
		int a = 0;
		while (x > 0) {
			a = a * 10 + x % 10;
			x /= 10;
		}
		return a;
	}

	class myDate {
		int d, m, y;

		int[] ml = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

		public myDate(int da, int ma, int ya) {
			d = da;
			m = ma;
			y = ya;
			if (ma > 12 || ma < 1 || da > ml[ma - 1] || da < 1) {
				d = 1;
				m = 1;
				y = 9999999;
			}
		}

		void incYear(int x) {
			for (int i = 0; i < x; i++) {
				y++;
				if (m == 2 && d == 29) {
					m = 3;
					d = 1;
					return;
				}
				if (m == 3 && d == 1) {
					if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) {
						m = 2;
						d = 29;
					}
					return;
				}
			}
		}

		boolean less(myDate x) {
			if (y < x.y) return true;
			if (y > x.y) return false;
			if (m < x.m) return true;
			if (m > x.m) return false;
			if (d < x.d) return true;
			if (d > x.d) return false;
			return true;
		}

		void inc() {
			if ((d == 31) && (m == 12)) {
				y++;
				d = 1;
				m = 1;
			} else {
				if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) {
					ml[1] = 29;
				}
				if (d == ml[m - 1]) {
					m++;
					d = 1;
				} else
					d++;
			}
		}
	}

	int partition(int n, int l, int m) {// n - sum, l - length, m - every part
		// <= m
		if (n < l) return 0;
		if (n < l + 2) return 1;
		if (l == 1) return 1;
		int c = 0;
		for (int i = Math.min(n - l + 1, m); i >= (n + l - 1) / l; i--) {
			c += partition(n - i, l - 1, i);
		}
		return c;
	}

	int rifmQuality(String a, String b) {
		if (a.length() > b.length()) {
			String c = a;
			a = b;
			b = c;
		}
		int c = 0, d = b.length() - a.length();
		for (int i = a.length() - 1; i >= 0; i--) {
			if (a.charAt(i) == b.charAt(i + d)) c++;
			else
				break;
		}
		return c;
	}

	String numSym = "0123456789ABCDEF";

	String ZFromXToYNotation(int x, int y, String z) {
		if (z.equals("0")) return "0";
		String a = "";
		long q = 0, t = 1;
		for (int i = z.length() - 1; i >= 0; i--) {
			q += (z.charAt(i) - 48) * t;
			t *= x;
		}
		while (q > 0) {
			a = numSym.charAt((int) (q % y)) + a;
			q /= y;
		}
		return a;
	}

	double angleFromXY(int x, int y) {
		if ((x == 0) && (y > 0)) return Math.PI / 2;
		if ((x == 0) && (y < 0)) return -Math.PI / 2;
		if ((y == 0) && (x > 0)) return 0;
		if ((y == 0) && (x < 0)) return Math.PI;
		if (x > 0) return Math.atan((double) y / x);
		else {
			if (y > 0) return Math.atan((double) y / x) + Math.PI;
			else
				return Math.atan((double) y / x) - Math.PI;
		}
	}

	static boolean isNumber(String x) {
		try {
			Integer.parseInt(x);
		} catch (NumberFormatException ex) {
			return false;
		}
		return true;
	}

	static boolean stringContainsOf(String x, String c) {
		for (int i = 0; i < x.length(); i++) {
			if (c.indexOf(x.charAt(i)) == -1) return false;
		}
		return true;
	}

	long pow(long a, long n) { // b > 0
		if (n == 0) return 1;
		long k = n, b = 1, c = a;
		while (k != 0) {
			if (k % 2 == 0) {
				k /= 2;
				c *= c;
			} else {
				k--;
				b *= c;
			}
		}
		return b;
	}

	int pow(int a, int n) { // b > 0
		if (n == 0) return 1;
		int k = n, b = 1, c = a;
		while (k != 0) {
			if (k % 2 == 0) {
				k /= 2;
				c *= c;
			} else {
				k--;
				b *= c;
			}
		}
		return b;
	}

	double pow(double a, int n) { // b > 0
		if (n == 0) return 1;
		double k = n, b = 1, c = a;
		while (k != 0) {
			if (k % 2 == 0) {
				k /= 2;
				c *= c;
			} else {
				k--;
				b *= c;
			}
		}
		return b;
	}

	double log2(double x) {
		return Math.log(x) / Math.log(2);
	}

	int lpd(int[] primes, int x) {// least prime divisor
		int i;
		for (i = 0; primes[i] <= x / 2; i++) {
			if (x % primes[i] == 0) {
				return primes[i];
			}
		}
		;
		return x;
	}

	int np(int[] primes, int x) {// number of prime number
		for (int i = 0; true; i++) {
			if (primes[i] == x) return i;
		}
	}

	int[] dijkstra(int[][] map, int n, int s) {
		int[] p = new int[n];
		boolean[] b = new boolean[n];
		Arrays.fill(p, Integer.MAX_VALUE);
		p[s] = 0;
		b[s] = true;
		for (int i = 0; i < n; i++) {
			if (i != s) p[i] = map[s][i];
		}
		while (true) {
			int m = Integer.MAX_VALUE, mi = -1;
			for (int i = 0; i < n; i++) {
				if (!b[i] && (p[i] < m)) {
					mi = i;
					m = p[i];
				}
			}
			if (mi == -1) break;
			b[mi] = true;
			for (int i = 0; i < n; i++)
				if (p[mi] + map[mi][i] < p[i]) p[i] = p[mi] + map[mi][i];
		}
		return p;
	}

	boolean isLatinChar(char x) {
		if (((x >= 'a') && (x <= 'z')) || ((x >= 'A') && (x <= 'Z'))) return true;
		else
			return false;
	}

	boolean isBigLatinChar(char x) {
		if (x >= 'A' && x <= 'Z') return true;
		else
			return false;
	}

	boolean isSmallLatinChar(char x) {
		if (x >= 'a' && x <= 'z') return true;
		else
			return false;
	}

	boolean isDigitChar(char x) {
		if (x >= '0' && x <= '9') return true;
		else
			return false;
	}

	class NotANumberException extends Exception {
		private static final long serialVersionUID = 1L;
		String mistake;

		NotANumberException() {
			mistake = "Unknown.";
		}

		NotANumberException(String message) {
			mistake = message;
		}
	}

	class Real {
		String num = "0";
		long exp = 0;
		boolean pos = true;

		long length() {
			return num.length();
		}

		void check(String x) throws NotANumberException {
			if (!stringContainsOf(x, "0123456789+-.eE")) throw new NotANumberException("Illegal character.");
			long j = 0;
			for (long i = 0; i < x.length(); i++) {
				if ((x.charAt((int) i) == '-') || (x.charAt((int) i) == '+')) {
					if (j == 0) j = 1;
					else
						if (j == 5) j = 6;
						else
							throw new NotANumberException("Unexpected sign.");
				} else
					if ("0123456789".indexOf(x.charAt((int) i)) != -1) {
						if (j == 0) j = 2;
						else
							if (j == 1) j = 2;
							else
								if (j == 2)
								;
								else
									if (j == 3) j = 4;
									else
										if (j == 4)
										;
										else
											if (j == 5) j = 6;
											else
												if (j == 6)
												;
												else
													throw new NotANumberException("Unexpected digit.");
					} else
						if (x.charAt((int) i) == '.') {
							if (j == 0) j = 3;
							else
								if (j == 1) j = 3;
								else
									if (j == 2) j = 3;
									else
										throw new NotANumberException("Unexpected dot.");
						} else
							if ((x.charAt((int) i) == 'e') || (x.charAt((int) i) == 'E')) {
								if (j == 2) j = 5;
								else
									if (j == 4) j = 5;
									else
										throw new NotANumberException("Unexpected exponent.");
							} else
								throw new NotANumberException("O_o.");
			}
			if ((j == 0) || (j == 1) || (j == 3) || (j == 5)) throw new NotANumberException("Unexpected end.");
		}

		public Real(String x) throws NotANumberException {
			check(x);
			if (x.charAt(0) == '-') pos = false;
			long j = 0;
			String e = "";
			boolean epos = true;
			for (long i = 0; i < x.length(); i++) {
				if ("0123456789".indexOf(x.charAt((int) i)) != -1) {
					if (j == 0) num += x.charAt((int) i);
					if (j == 1) {
						num += x.charAt((int) i);
						exp--;
					}
					if (j == 2) e += x.charAt((int) i);
				}
				if (x.charAt((int) i) == '.') {
					if (j == 0) j = 1;
				}
				if ((x.charAt((int) i) == 'e') || (x.charAt((int) i) == 'E')) {
					j = 2;
					if (x.charAt((int) (i + 1)) == '-') epos = false;
				}
			}
			while ((num.length() > 1) && (num.charAt(0) == '0'))
				num = num.substring(1);
			while ((num.length() > 1) && (num.charAt(num.length() - 1) == '0')) {
				num = num.substring(0, num.length() - 1);
				exp++;
			}
			if (num.equals("0")) {
				exp = 0;
				pos = true;
				return;
			}
			while ((e.length() > 1) && (e.charAt(0) == '0'))
				e = e.substring(1);
			try {
				if (e != "") if (epos) exp += Long.parseLong(e);
				else
					exp -= Long.parseLong(e);
			} catch (NumberFormatException exc) {
				if (!epos) {
					num = "0";
					exp = 0;
					pos = true;
				} else {
					throw new NotANumberException("Too long exponent");
				}
			}
		}

		public Real() {
		}

		String toString(long mantissa) {
			String a = "", b = "";
			if (exp >= 0) {
				a = num;
				if (!pos) a = '-' + a;
				for (long i = 0; i < exp; i++)
					a += '0';
				for (long i = 0; i < mantissa; i++)
					b += '0';
				if (mantissa == 0) return a;
				else
					return a + "." + b;
			} else {
				if (exp + length() <= 0) {
					a = "0";
					if (mantissa == 0) {
						return a;
					}
					if (mantissa < -(exp + length() - 1)) {
						for (long i = 0; i < mantissa; i++)
							b += '0';
						return a + "." + b;
					} else {
						if (!pos) a = '-' + a;
						for (long i = 0; i < mantissa; i++)
							if (i < -(exp + length())) b += '0';
							else
								if (i + exp >= 0) b += '0';
								else
									b += num.charAt((int) (i + exp + length()));
						return a + "." + b;
					}
				} else {
					if (!pos) a = "-";
					for (long i = 0; i < exp + length(); i++)
						a += num.charAt((int) i);
					if (mantissa == 0) return a;
					for (long i = exp + length(); i < exp + length() + mantissa; i++)
						if (i < length()) b += num.charAt((int) i);
						else
							b += '0';
					return a + "." + b;
				}
			}
		}
	}

	boolean containsRepeats(int... num) {
		Set<Integer> s = new TreeSet<Integer>();
		for (int d : num)
			if (!s.contains(d)) s.add(d);
			else
				return true;
		return false;
	}

	int[] rotateDice(int[] a, int n) {
		int[] c = new int[6];
		if (n == 0) {
			c[0] = a[1];
			c[1] = a[5];
			c[2] = a[2];
			c[3] = a[0];
			c[4] = a[4];
			c[5] = a[3];
		}
		if (n == 1) {
			c[0] = a[2];
			c[1] = a[1];
			c[2] = a[5];
			c[3] = a[3];
			c[4] = a[0];
			c[5] = a[4];
		}
		if (n == 2) {
			c[0] = a[3];
			c[1] = a[0];
			c[2] = a[2];
			c[3] = a[5];
			c[4] = a[4];
			c[5] = a[1];
		}
		if (n == 3) {
			c[0] = a[4];
			c[1] = a[1];
			c[2] = a[0];
			c[3] = a[3];
			c[4] = a[5];
			c[5] = a[2];
		}
		if (n == 4) {
			c[0] = a[0];
			c[1] = a[2];
			c[2] = a[3];
			c[3] = a[4];
			c[4] = a[1];
			c[5] = a[5];
		}
		if (n == 5) {
			c[0] = a[0];
			c[1] = a[4];
			c[2] = a[1];
			c[3] = a[2];
			c[4] = a[3];
			c[5] = a[5];
		}
		return c;
	}

	int min(int... a) {
		int c = Integer.MAX_VALUE;
		for (int d : a)
			if (d < c) c = d;
		return c;
	}

	int max(int... a) {
		int c = Integer.MIN_VALUE;
		for (int d : a)
			if (d > c) c = d;
		return c;
	}

	int[] normalizeDice(int[] a) {
		int[] c = a.clone();
		if (c[0] != 0) if (c[1] == 0) c = rotateDice(c, 0);
		else
			if (c[2] == 0) c = rotateDice(c, 1);
			else
				if (c[3] == 0) c = rotateDice(c, 2);
				else
					if (c[4] == 0) c = rotateDice(c, 3);
					else
						if (c[5] == 0) c = rotateDice(rotateDice(c, 0), 0);
		while (c[1] != min(c[1], c[2], c[3], c[4]))
			c = rotateDice(c, 4);
		return c;
	}

	boolean sameDice(int[] a, int[] b) {
		for (int i = 0; i < 6; i++)
			if (a[i] != b[i]) return false;
		return true;
	}

	final double goldenRatio = (1 + Math.sqrt(5)) / 2;
	final double aGoldenRatio = (1 - Math.sqrt(5)) / 2;

	long Fib(int n) {
		if (n < 0) if (n % 2 == 0) return -Math.round((pow(goldenRatio, -n) - pow(aGoldenRatio, -n)) / Math.sqrt(5));
		else
			return -Math.round((pow(goldenRatio, -n) - pow(aGoldenRatio, -n)) / Math.sqrt(5));
		return Math.round((pow(goldenRatio, n) - pow(aGoldenRatio, n)) / Math.sqrt(5));
	}

	class japaneeseComparator implements Comparator<String> {
		@Override
		public int compare(String a, String b) {
			int ai = 0, bi = 0;
			boolean m = false, ns = false;
			if (a.charAt(ai) <= '9' && a.charAt(ai) >= '0') {
				if (b.charAt(bi) <= '9' && b.charAt(bi) >= '0') m = true;
				else
					return -1;
			}
			if (b.charAt(bi) <= '9' && b.charAt(bi) >= '0') {
				if (a.charAt(ai) <= '9' && a.charAt(ai) >= '0') m = true;
				else
					return 1;
			}
			a += "!";
			b += "!";
			int na = 0, nb = 0;
			while (true) {
				if (a.charAt(ai) == '!') {
					if (b.charAt(bi) == '!') break;
					return -1;
				}
				if (b.charAt(bi) == '!') {
					return 1;
				}
				if (m) {
					int ab = -1, bb = -1;
					while (a.charAt(ai) <= '9' && a.charAt(ai) >= '0') {
						if (ab == -1) ab = ai;
						ai++;
					}
					while (b.charAt(bi) <= '9' && b.charAt(bi) >= '0') {
						if (bb == -1) bb = bi;
						bi++;
					}
					m = !m;
					if (ab == -1) {
						if (bb == -1) continue;
						else
							return 1;
					}
					if (bb == -1) return -1;
					while (a.charAt(ab) == '0' && ab + 1 != ai) {
						ab++;
						if (!ns) na++;
					}
					while (b.charAt(bb) == '0' && bb + 1 != bi) {
						bb++;
						if (!ns) nb++;
					}
					if (na != nb) ns = true;
					if (ai - ab < bi - bb) return -1;
					if (ai - ab > bi - bb) return 1;
					for (int i = 0; i < ai - ab; i++) {
						if (a.charAt(ab + i) < b.charAt(bb + i)) return -1;
						if (a.charAt(ab + i) > b.charAt(bb + i)) return 1;
					}
				} else {
					m = !m;
					while (true) {
						if (a.charAt(ai) <= 'z' && a.charAt(ai) >= 'a' && b.charAt(bi) <= 'z' && b.charAt(bi) >= 'a') {
							if (a.charAt(ai) < b.charAt(bi)) return -1;
							if (a.charAt(ai) > b.charAt(bi)) return 1;
							ai++;
							bi++;
						} else
							if (a.charAt(ai) <= 'z' && a.charAt(ai) >= 'a') return 1;
							else
								if (b.charAt(bi) <= 'z' && b.charAt(bi) >= 'a') return -1;
								else
									break;
					}
				}
			}
			if (na < nb) return 1;
			if (na > nb) return -1;
			return 0;
		}
	}

	void mpr(int x) {
		out.print(' ');
		if (x < 100) out.print(' ');
		if (x < 10) out.print(' ');
		out.print(x);
	}

	int mtry(String s, String alph) {
		String t = "";
		Random r = new Random();
		int c = 0, l = alph.length();
		for (int i = 0; i < s.length(); i++) {
			t += alph.charAt(r.nextInt(l));
			c++;
		}
		while (!t.equals(s)) {
			t = t.substring(1);
			t += alph.charAt(r.nextInt(l));
			c++;
		}
		return c;
	}

	void mtest(String s, String alph, int d) {
		int n = d, r = 0;
		for (int i = 0; i < n; i++) {
			r += mtry(s, alph);
		}
		int re = (int) Math.round((0.0 + r) / n);
		out.println("\"" + s + "\" = " + re + ", Average = " + ((0.0 + r) / n));
		/*
		 * String res = Integer.toString(re); if (!tab.contains(res)) {
		 * tab.put(res, new Vector<String>()); } tab.get(res).add(s);
		 */
	}
	
	int n;
	int a[][];
	
	int myWay(){
		Set g = new HashSet();
		int m;
		Set ts;
		for (int k = 0; k < 3; k++) {
			m = -1000;
			ts = new HashSet();
			for (int i = 0; i < n; i++) {
				int t = a[i][k];
				if (t == m) {
					ts.add(i);
				}
				if (t > m) {
					m = t;
					ts = new HashSet();
					ts.add(i);
				}
			}
			for (Iterator<Integer> i = ts.iterator(); i.hasNext();) {
				int j = i.next();
				if (!g.contains(j)) {
					g.add(j);
				}
			}
		}
		return n - g.size();
	}
	
	boolean f(int i, int j){
        return(a[i][0]>a[j][0]&&a[i][1]>a[j][1]&&a[i][2]>a[j][2]);
    }
	
	int mjWay(){
		boolean b[] = new boolean[n];;
	    int c = 0;
	    for(int i=0; i<n; i++)
	    	for(int j=0; j<i; j++)
                if(f(i,j)&&!b[j]){b[j]=true;c++;}else if(f(j,i)&&!b[i]){b[i]=true;c++;j=i;}
        return c;
	}
	
	Random random = new Random();
	
	void gen(int lim1, int lim2) {
		n = random.nextInt(lim1);
		a = new int[n][3];
		for (int i = 0; i < n; i++) {
			a[i][0] = random.nextInt(lim2);
			a[i][1] = random.nextInt(lim2);
			a[i][2] = random.nextInt(lim2);
		}
	}
	
	static class elem{
		int a, b, c;
	}
	
	class ballCmp implements Comparator<elem> {
		public int compare(elem a, elem b) {
			if (a.a < b.a) return -1;
			if (a.a > b.a) return 1;
			if (a.b < b.b) return -1;
			if (a.b > b.b) return 1;
			if (a.c < b.c) return -1;
			if (a.c > b.c) return 1;
			return 0;
		}
	}

	void solve() throws IOException {
		/*
		 * String[] st = new String[52000]; in.resetSyntax(); in.wordChars(' ' +
		 * 1, 255); in.whitespaceChars(0, ' '); int n = 0; while (true) { String
		 * t = nextString(); if (in.ttype == StreamTokenizer.TT_EOF) break;
		 * st[n] = t; n++; } st = Arrays.copyOf(st, n); Arrays.sort(st, new
		 * japaneeseComparator()); for (int i = 0; i < n; i++) {
		 * out.println(st[i]); }
		 */
		/*int n = nextInt();
		elem[] a = new elem[n];
		for (int i = 0; i < n; i++) {
			a[i] = new elem();
			a[i].a = nextInt();
		}
		for (int i = 0; i < n; i++) {
			a[i].b = nextInt();
		}
		for (int i = 0; i < n; i++) {
			a[i].c = nextInt();
		}
		Arrays.sort(a, new ballCmp());
		for (int i = 0; i < n; i++) out.println(a[i].a + " " + a[i].b + " " + a[i].c);
		for (int i = n - 1; i >= 0; i--) {
			
		}*/
		
		int n = nextInt(), m = nextInt(), s = nextInt();
		int a = (n - 1) / s + 1;
		int b = (m - 1) / s + 1;
		int x = n - (a - 1) * s;
		int y = m - (b - 1) * s;
		//out.println(a + " " + b + " " + x + " " + y);
		out.println((long)a * b * x * y);
	}
}
