Как указал Федерико, проблема, вероятно, заключается в вашем факториале () или pow (). Я выполнил тест, который работал нормально, заменив ваши функции функцией pow (), предоставленной в классе Math, и этим factorial ():
public static long factorial(long n) {
if (n < 0) throw new RuntimeException("Underflow error in factorial");
else if (n > 20) throw new RuntimeException("Overflow error in factorial");
else if (n == 0) return 1;
else return n * factorial(n-1);
}