import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Kfun {

	/**
	 * @param args
	 * @throws IOException
	 */
	static int count = 0;
	public static void main(String[] args) throws IOException {
		int n;
		int a;
		int b;
		int c;
		int kvalue;
		String m;
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			System.out.print("Please enter n: ");
			m = in.readLine();
			System.out.println();
			n = Integer.parseInt(m);
			if (n > 16 || n < 1)
				System.out.println("wrong input, try again");
			else {
				System.out.print("Please enter a: ");
				m = in.readLine();
				System.out.println();
				a = Integer.parseInt(m);
				System.out.print("Please enter b: ");
				m = in.readLine();
				System.out.println();
				b = Integer.parseInt(m);
				System.out.print("Please enter c: ");
				m = in.readLine();
				System.out.println();
				c = Integer.parseInt(m);
				break;
			}

		}
		kvalue = kfun(n, a, b, c);
		System.out.println("The function value is: " + kvalue);
		System.out.println("The number of function calls is: " + count);
	}

	public static int kfun(int n, int a, int b, int c) {
		count++;
		return (hfun(n - 1, c - 1, a - 1, b) + gfun(n, c + 1, a, b - 1));
	}

	public static int hfun(int n, int a, int b, int c) {
		count++;
		if (n > 0)
			return (kfun(n - 1, c - 1, b - 1, a) + gfun(n - 2, c - 1, a - 1, b) + n);
		else
			return (3 * a + 2 * b + n - c + 1);
	}

	public static int gfun(int n, int a, int b, int c) {
		count++;
		if (n > 0)
			return (hfun(n - 1, c - 1, b + 1, a) + kfun(n - 2, b - 1, c, a - 1));
		else
			return (a * b + c -1);
	}
}
