我们假设p为素数,n!=a*pe,则我们需要求解a mod p和e。
e是n!能够迭代整除p的次数,因此可以使用下面式子计算:
n/p+n/p2+n/p3……
我们只需要对pt≤n的t进行计算所以复杂度为O(logpn)
接下来计算a mod p。
首先计算n!的因数中不能被p整除的项的积。
举个简单的例子后不难发现,不能被p整除的项在mod p下呈周期性。
因此,可将n!的因数中不能被p整除的项的积化为如下式子:
(p-1)!(n/p)*(n mod p)!。
根据威尔逊定理,我们有(p-1)!≡-1。所以这时候我们只需要求n/p的奇偶和(n mod p)!就可以了。
//威尔逊定理及证明见:http://www.cnblogs.com/wls001/p/5160288.html
这时我们只有预处理出0<=n<p的范围中n! mod p 的表就可以在O(logp n)时间内算出答案了。如果不预处理,那么复杂度就是O(p logp n)。