public static BigInteger factorial(int n) {if (n == 0 || n < 0) {return BigInteger.ONE;}if (cache.containsKey(n))  {return cache.get(n);}BigInteger result = BigInteger.valueOf(n).multiply(factorial(n - 2));cache.put(n, result);return result;}
public static BigInteger factorial(int n){if (n == 0 || n < 0){return BigInteger.One;}if (cache.ContainsKey(n)){return cache[(n)];}BigInteger result = BigInteger.ValueOf(n).Multiply(factorial(n - 2));cache.Add(n, result);return result;}