import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map.Entry;

import java.util.StringTokenizer;

public class Main {
	
	public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	}
	
	public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	}

	public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	}
} import java.io.BufferedReader; BufferedReader java.io import java.io.Closeable; Closeable java.io import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.io.InputStreamReader; InputStreamReader java.io import java.util.ArrayList; ArrayList java.util import java.util.Arrays; Arrays java.util import java.util.HashMap; HashMap java.util import java.util.HashSet; HashSet java.util import java.util.LinkedList; LinkedList java.util import java.util.Map.Entry; Entry java.util.Map import java.util.StringTokenizer; StringTokenizer java.util public class Main {
	
	public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	}
	
	public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	}

	public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	}
} Main public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	} area {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	} final long total = W * H; total W * H W H final double dx = (double)(y) / x; dx (double)(y) / x (double)(y) x final double upper = (double)(x * y) / 2; upper (double)(x * y) / 2 (double)(x * y) x y 2 final double middle = (H - y) * x; middle (H - y) * x (H - y) H y x final double nx = Math.min(W - x, (H - y) * dx); nx Math.min(W - x, (H - y) * dx) Math.min Math W - x W x (H - y) * dx (H - y) H y dx final double ry = (H - y) - Math.min(H - y, nx / dx); ry (H - y) - Math.min(H - y, nx / dx) (H - y) H y Math.min(H - y, nx / dx) Math.min Math H - y H y nx / dx nx dx final double lower = ((H - y) - (ry)) * nx / 2.0; lower ((H - y) - (ry)) * nx / 2.0 ((H - y) - (ry)) * nx ((H - y) - (ry)) (H - y) H y (ry) nx 2.0 final double area = upper + middle + lower; area upper + middle + lower upper + middle + lower upper middle lower return Math.min(area, total - area); Math.min(area, total - area) Math.min Math area total - area total area long W W long H H long x x long y y public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	} main {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	} try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		} {
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		} final Scanner sc = new Scanner(System.in) final Scanner sc = new Scanner(System.in) new Scanner(System.in) final long W = sc.nextLong(); W sc.nextLong() sc.nextLong sc final long H = sc.nextLong(); H sc.nextLong() sc.nextLong sc final long x = sc.nextLong(); x sc.nextLong() sc.nextLong sc final long y = sc.nextLong(); y sc.nextLong() sc.nextLong sc System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0) System.out.printf System.out System System.out "%.10f %d\n" W * H / 2.0 W * H W H 2.0 (W == x * 2 && H == y * 2) ? 1 : 0 (W == x * 2 && H == y * 2) W == x * 2 W x * 2 x 2 H == y * 2 H y * 2 y 2 1 0 String[] args args public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	} Scanner private BufferedReader br; br private StringTokenizer tok; tok public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		} Scanner {
			br = new BufferedReader(new InputStreamReader(is));
		} br = new BufferedReader(new InputStreamReader(is)) br new BufferedReader(new InputStreamReader(is)) InputStream is is private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		} getLine {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		} while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			} !hasNext() hasNext() hasNext {
				tok = new StringTokenizer(br.readLine());
			} tok = new StringTokenizer(br.readLine()) tok new StringTokenizer(br.readLine()) private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		} hasNext {
			return tok != null && tok.hasMoreTokens();
		} return tok != null && tok.hasMoreTokens(); tok != null && tok.hasMoreTokens() tok != null tok null tok.hasMoreTokens() tok.hasMoreTokens tok public String next() throws IOException {
			getLine();
			return tok.nextToken();
		} next {
			getLine();
			return tok.nextToken();
		} getLine() getLine return tok.nextToken(); tok.nextToken() tok.nextToken tok public int nextInt() throws IOException {
			return Integer.parseInt(next());
		} nextInt {
			return Integer.parseInt(next());
		} return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next public long nextLong() throws IOException {
			return Long.parseLong(next());
		} nextLong {
			return Long.parseLong(next());
		} return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		} nextDouble {
			return Double.parseDouble(next());
		} return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		} nextIntArray {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		} final int[] ret = new int[n]; ret new int[n] n for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
				ret[i] = this.nextInt();
			} {
				ret[i] = this.nextInt();
			} ret[i] = this.nextInt() ret[i] ret i this.nextInt() this.nextInt this return ret; ret int n n public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		} nextLongArray {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		} final long[] ret = new long[n]; ret new long[n] n for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
				ret[i] = this.nextLong();
			} {
				ret[i] = this.nextLong();
			} ret[i] = this.nextLong() ret[i] ret i this.nextLong() this.nextLong this return ret; ret int n n public void close() throws IOException {
			br.close();
		} close {
			br.close();
		} br.close() br.close br Closeable public class Main {
	
	public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	}
	
	public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	}

	public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	}
} public class Main {
	
	public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	}
	
	public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	}

	public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	}
} Main
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map.Entry;

import java.util.StringTokenizer;

public class Main {
	
	public static double area(long W, long H, long x, long y) {
		final long total = W * H;
		
		final double dx = (double)(y) / x;

		final double upper = (double)(x * y) / 2;
		final double middle = (H - y) * x;
		
		final double nx = Math.min(W - x, (H - y) * dx);
		final double ry = (H - y) - Math.min(H - y, nx / dx);
		
		final double lower = ((H - y) - (ry)) * nx / 2.0;
		
		final double area = upper + middle + lower;
		return Math.min(area, total - area);
	}
	
	public static void main(String[] args) throws IOException {
		try(final Scanner sc = new Scanner(System.in)){
			final long W = sc.nextLong();
			final long H = sc.nextLong();
			final long x = sc.nextLong();
			final long y = sc.nextLong();
			
			System.out.printf("%.10f %d\n", W * H / 2.0, (W == x * 2 && H == y * 2) ? 1 : 0);
		}
	}

	public static class Scanner implements Closeable {
		private BufferedReader br;
		private StringTokenizer tok;

		public Scanner(InputStream is) throws IOException {
			br = new BufferedReader(new InputStreamReader(is));
		}

		private void getLine() throws IOException {
			while(!hasNext()){
				tok = new StringTokenizer(br.readLine());
			}
		}

		private boolean hasNext() {
			return tok != null && tok.hasMoreTokens();
		}

		public String next() throws IOException {
			getLine();
			return tok.nextToken();
		}

		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}

		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public int[] nextIntArray(int n) throws IOException {
			final int[] ret = new int[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextInt();
			}
			return ret;
		}

		public long[] nextLongArray(int n) throws IOException {
			final long[] ret = new long[n];
			for(int i = 0; i < n; i++){
				ret[i] = this.nextLong();
			}
			return ret;
		}

		public void close() throws IOException {
			br.close();
		}
	}
}