Комбинаторная задача заключается в нахождении различных волейбольных партий с заданным счётом. Различные партии - это партии с различным порядком набора очков. Играют до 25 с разрывом очков минимум 2. Если счёт 24:24, то идёт партия до бесконечности, пока не будет разрыв в два очка.
Проблема заключается в той самой ничье. Я написал код, вроде работает правильно, но при счёте 38:40 должен быть ответ 528344738743910400, когда у меня... 528344738743910464. Два разряда отличаются в конце, и то я не знаю как не изменились другие, когда там идёт речь про умножение чисел больше миллиарда. Помогите, пожалуйста!
функция foo, которая ведёт счёт различных "подпартий" после счёта 24:24) :
long double foo(int score1, int score2, int limit1, int limit2) {
if (score1 == limit1 && score2 == limit2) return 1;
else if (abs(score1 - score2) >= 2) return 0;
else if (score1 == limit1) return foo(score1, score2 + 1, limit1, limit2);
else if (score2 == limit2) return foo(score1 + 1, score2, limit1, limit2);
else return foo(score1 + 1, score2, limit1, limit2) + foo(score1, score2 + 1, limit1, limit2);
}
код из main (scoreT1 - количество очков первой команды, scoreT2 - второй команды, сначала ans присваивается количество различных партий со счётом 24:24, потом это значение умножается на количество различных "подпартий" после 24:24 до заданного счёта):
ans = factorial(48) / (factorial(24) * factorial(24));
ans *= foo(24, 24, scoreT1, scoreT2);