n!mod p的求法

我们假设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)。

时间: 2024-11-06 09:52:49

n!mod p的求法的相关文章

n!mod p 的求法 数学

今天在教室看了一上午的白书,发现其中的这一章很有意思,用各种神奇的解法来做一个没有任何用的阶乘取模. 首先我们直到如果p<n的话,取模的结果肯定是0对吧,如果p>n他又叫我们直接预处理出来,真的搞不懂. 然后就是他给的神奇方法: “ 在计数问题中,经常需要用到n!.在学完前面的介绍之后,有必要了解n!在mod p下的一些性质,下面我们假设p是素数,n!=a pe(a无法被p整除),并试图求解a mod p和e. e是n!能够迭代整除p的次数,因此可以使用下面的式子计算. n/p+n/p2+n/

能蜜履拖栖cn0ih1010n15

听着天梦冰蚕的讲述,霍雨浩早已忘记了恐惧,义愤填膺的道:"它们太可恶了,怎么能这样,居然囚禁了你近万年之久."巫风右腿闪电般弹起,直奔倒下的霍雨浩踢去,她这一下速度极快.眼看就要踢中霍雨浩的胸膛了.先前天梦冰蚕散发出的强大精神力曾经令他们暂时失去思索的能力,不过因为他们与天梦冰蚕之间的对比相差太大所以并未察觉.但此时近在咫尺的霍雨浩就不同了,那份由眼眸散发出的精神波动令两人都是大吃一惊.磕头认错虽然不会伤残身体,但毫无疑问,无论输赢如何,这两个小团体都是结下大仇了.双方都有武魂系两名核

赜稳蔷擞苏a6del17necnkycg3k4

徐三石的作用可以说是完美展现,发动玄冥震之后,他根本没有停顿,身体一横,就闪了出来,玄冥置换光芒再现.史莱克战队这边,戴钥衡已经横跨一步迈了出来.只要玄冥置换再次成功,那么,史莱克学院这第二位魂帝也将被置换过去.一年多前,他独自一人离开公爵府来到星斗大森林,那时怀着不成功.则成仁的想法.如果不能获取一个何时的魂环,可能就会死在星斗大森林中,成为这里植物的养分.那时候的他,心中除了决绝就是对报仇的渴望.久久公主眼神平淡的看了一眼光罩外的冰雾,嘴角微微上翘,在她身前还有一名魂师.却始终没有加入战斗.

羡崖孪廖俗qpcrvfn725y6bm

"当我想到唐门的时候,我惊讶的发现,实际上,我所有的能力都可以和唐门有关.我的灵眸武魂,本身和紫极魔瞳就有着众多关系,正是通过紫极魔瞳,才让我拥有了灵魂冲击这样的精神系能力.反过来说,我的灵眸武魂在精神控制方面的造诣也同样能够帮助我来施展各种唐门绝学,这其中就包括唐门暗器.而冰碧帝皇蝎武魂就更不用说了,冰系魂技与唐门的各种擒拿.步法有效的结合在一起,就如王冬刚才所说的那样,必定能够令我的实战能力大大提升."第十章 初涉魂导器(三)此时,众人的目光都集中在霍雨浩身上.就连玄老也不例外.大

求C(p,q)%MOD(主要处理n!%MOD的求法)

#define ll long long #define maxn 1000010 #define MOD 1000000007 ll f[maxn],ny[maxn]; ll inv(ll a,ll m){ ll p=1,q=0,b=m,c,d; while(b>0){ c=a/b; d=a; a=b; b=d%b; d=p; p=q; q=d-c*q; } return p<0?p+m:p; } void init(){ f[0]=1; ny[0]=inv(f[0],MOD); for(i

x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法

/************************************* 求解x^a=b(mod c) x在[0,c-1]上解的个数模板 输入:1e9>=a,b>=1,1e9>=c>=3. 返回:调用xaeqbmodc(a,b,c),返回解的个数 复杂度: 找原根的复杂度很低,所以总的复杂度为O(c^0.5) ************************************/ typedef long long ll; #define HASH_N 100007 str

逆元以及线性逆元求法(转)

对于一个数a,如果a*a^-1=1(modp),那么a^-1是a对于p的逆元 在除法中,除以一个数等于乘上这个数的逆元,即x/y=x*y^-1(modp) 求单个逆元可以用费尔马小定理 对于质数p,a^(p-1)=1(modp),那么a^(p-2)*a=a^(p-1)=1(modp),所以a^-1=a^(p-2),用快速幂求即可 但对于一堆数,例如1~n一一求逆元,用快速幂是O(nlogn)的,若n达到1e7会爆炸,所以需要线性求逆元的方法 假设当前要求数i的逆元,且1~i-1的逆元都已经求好了

fibo数求法(递归版本) -- 作者小泽

fibonacci数的递归求法: 1 2 struct Fib 3 { 4 int x1; 5 int x2; 6 }; 7 8 Fib fib(int x) 9 { 10 Fib ans; 11 if(x == 2) 12 { 13 ans.x1 = 0; 14 ans.x2 = 1%MOD; 15 return ans; 16 } 17 Fib temp; 18 int x1 = x/2, x2 = x1 - 1; 19 if(x1%2) 20 { 21 temp = fib(x2); 22

割边最少的最小割求法两种(仅结论)

我太弱了,所以只贴上结论,省略(不会)证明. 求法一: 1.求出原网络的最大流. 2.把可能的关键割边(即满流的边)容量置为 1,其余边容量置为 0. 3.求出修改后网络的最大流. 此时的最大流即是最小割时最少的割边数. 总共求了 2 次最大流. 更好的求法二: 以下用 E 表示网络流中的边数. 1.建图时,把每条边的边权 w 置为 w * (E + 1) + 1. 2.求出修改后网络的最大流 flow_max. 此时原图的最大流为 flow_max / (E + 1) ,最少的割边数为 flo