中国剩余定理
问题描述:
给出n条形如 x≡ai(modmi) x ≡ a i ( mod m i ) ,那么你现在需要解出x。
实现方式
我们现在来考虑一种比较简单的情况:各个方程的m都是互质的,那么我们如果有一个
x=∑ni=1f(i)
x
=
∑
i
=
1
n
f
(
i
)
满足
f(i)%mi=ai,f(i)%aj,(j!=i)=0
f
(
i
)
%
m
i
=
a
i
,
f
(
i
)
%
a
j
,
(
j
!
=
i
)
=
0
,那么这个x就是一个满足条件的解了。
我们来构造一下,记
M=Πmi
M
=
Π
m
i
假设m不互质怎么办呢?没关系我们可以考虑合并方程。
对于 x≡a1(modm1),x≡a2(modm2) x ≡ a 1 ( mod m 1 ) , x ≡ a 2 ( mod m 2 ) ,则 x=a1+m1k1=a2+m2k2 x = a 1 + m 1 k 1 = a 2 + m 2 k 2
经过一阵子推导我们可以得到 x≡a1+m1cd(m1d)−1(这里的逆元是关于m2d的)(modm1m2d)(c=a2−a1,d=(m1,m2)) x ≡ a 1 + m 1 c d ( m 1 d ) − 1 ( 这 里 的 逆 元 是 关 于 m 2 d 的 ) ( mod m 1 m 2 d ) ( c = a 2 − a 1 , d = ( m 1 , m 2 ) )
卢卡斯定理
p是素数,则C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p
kummer定理
描述
证明
阶乘表示法
设
p=qe
p
=
q
e
(q是素数,结合中国剩余定理即可处理任意模数)
组合数可以表示成阶乘和阶乘逆元的乘积,所以我们只要考虑如何表示阶乘。设
n!=qk(n)v(n)
n
!
=
q
k
(
n
)
v
(
n
)
,其中vn与q互质。
阶乘n!可以表示成前n个连续正整数1,2,⋯,n的乘积,将这n个数中与q互质的数提取出来,这一部分的数乘积累积给v(n)。而不互质的数必然是q,2⋅q,⋯,
⌊n/q⌋∗q
⌊
n
/
q
⌋
∗
q
,每个数字提取一个q,则至少可以提取出⌊n/q⌋个q累加给k(n)。那么剩下没考虑的数字就是1,2,⋯,
⌊n/q⌋
⌊
n
/
q
⌋
也即
⌊n/q⌋!
⌊
n
/
q
⌋
!
,再次重复上述过程进行提取即可。
复杂度是O(
qe
q
e
+log n)