He tratado de evitar que el código desborde el rango de una variable larga en la medida de lo posible.
- He multiplicado ‘n’ con sus números anteriores solo en la medida necesaria (hasta r + 1 o n-r + 1, lo que sea mayor).
- He reunido los ceros acumulados en variables separadas para tratar más adelante.
public static long nCr (long n, long r, long p)
{
largo mayor = (r> = (nr))? r: (nr);
largo menor = n-mayor;
numerador largo = denominador = 1, numCount = denCount = 0;
para (; n> mayor; n–)
{
numerador * = n;
while (numerador% 10 == 0)
{
numerador / = 10;
numCount ++;
}
}
para (; menor> 1; menor–)
{
denominador * = menor;
while (denominador% 10 == 0)
{
denominador / = 10;
denCount ++;
}
}
return (numerador / denominador * Math.pow (10, numCount-denCount))% p;
}