大规模组合数计算,利用帕斯卡恒等式的递归会超时,利用帕斯卡三角形(杨辉三角)的递推会超存储。
必须直接使用组合数的计算公式:*****)=n!/(m!*(n-m)!)
数值较大,一般对某个数值取模之后的结果。
取模运算对加、减、乘封闭,直接使用组合数计算公式涉及到除法运算,运算过程中进行取模会导致错误,因此要使用到逆元概念:a^(p-2) ≡ 1/a (mod p),将除法转换成其他运算。
逆元概念和计算方式来源于费马小定理:如果p是质数,且整数a不是p的倍数,那么一定有a^(p−1) ≡ 1(mod p)。两边分别除以非p倍数的a即可得到逆元的计算公式。
有了逆元计算公式,则:*****)%MOD = n!/(m!*(n-m)!)%MOD,可以转换成 n!*(1/m!)%MOD*(1/(n-m)!)%MOD。除法变乘法,取余运算封闭。