简单数论选讲
声明:此课件中用这个格式的证明不必详细了解,只是为了让你更信服
一、逆元
因为逆元不归我讲,但是又很重要,所以在这里一笔带过
一整数 a a a对同余 p p p之模逆元是指满足以下公式的整数 b b b
a − 1 ≡ b ( m o d p ) a^{-1}\equiv b(mod\ p) a−1≡b(mod p)
也可以写成以下的式子
a b ≡ 1 ( m o d p ) ab\equiv 1(mod\ p) ab≡1(mod p)
整数 a a a对模数 p p p之模逆元存在的充分必要条件是 a a a和 p p p互素,若此模逆元存在,在模数 p p p下的除法可以用和对应模逆元的乘法来达成,此概念和实数除法的概念相同。
模意义下的逆元就好比实数运算中的倒数,模意义下除以一个数就相当于乘上这个数的逆元,就可以实现模意义下的除法啦!
二、费马小定理
费马小定理在OI中最(wei)大(yi)的用途就是求乘法逆元
内容:当 p p p为质数时有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(mod\ p) ap−1≡1(mod p)
所以 a p − 2 ∗ a ≡ 1 ( m o d p ) a^{p-2}*a\equiv 1(mod\ p) ap−2∗a≡1(mod p),即 a p − 2 a^{p-2} ap−2为 a a a在模 p p p意义下的逆元
可以直接用快速幂求出
费马小定理的证明(其实并没有多大用):
引理一:如果 p , c p,c p,c互质 a ∗ c ≡ b ∗ c ( m o d p ) a*c\equiv b*c(mod\ p) a∗c≡b∗c(mod p),则有 a ≡ b ( m o d p ) a \equiv b(mod\ p) a≡b(mod p)
证明:
∵ a ∗ c ≡ b ∗ c ( m o d p ) \because a*c\equiv b*c(mod\ p) ∵a∗c≡b∗c(mod p)
∴ ( a − b ) ∗ c ≡ 0 ( m o d p ) \therefore (a-b)*c\equiv 0(mod\ p) ∴(a−b)∗c≡0(mod p)
∵ c \because c ∵c与 p p p互质
∴ a − b ≡ 0 ( m o d p ) \therefore a-b\equiv 0(mod\ p) ∴a−b≡0(mod p)引理二:若有 p p p的完全剩余系 a 1 , a 2 , . . . , a p {a_1,a_2,...,a_p} a1,a2,...,ap,且 p , c p,c p,c互质,则 a 1 ∗ c , a 2 ∗ c , . . . , a p ∗ c {a_1*c,a_2*c,...,a_p*c} a1∗c,a2∗c,...,ap∗c也是 p p p的完全剩余系
完全剩余系,即是通过对一系列正整数 m o d m mod\ m mod m后产生的从 0 0 0至 m − 1 m-1 m−1的完全数系
证明:反证法,假设存在 a i ∗ c ≡ a j ∗ c ( m o d p ) a_i*c\equiv a_j*c(mod\ p) ai∗c≡aj∗c(mod p),由引理一得, a i ≡ a j ( m o d p ) a_i\equiv a_j(mod\ p) ai≡aj(mod p),假设不成立,引理二成立
费马小定理证明:
∵ 0 , 1 , 2 , 3 , . . . , p − 1 \because 0,1,2,3,...,p-1 ∵0,1,2,3,...,p−1为 p p p的一个完全剩余系
∴ 0 , a , 2 ∗ a , 3 ∗ a , . . . , ( p − 1 ) ∗ a \therefore 0,a,2*a,3*a,...,(p-1)*a ∴0,a,2∗a,3∗a,...,(p−1)∗a为 p p p的一个完全剩余系,
且 { a m o d p , 2 ∗ a m o d p , 3 ∗ a m o d p , . . . , ( p − 1 ) ∗ a m o d p } = { 1 , 2 , 3 , . . . , p − 1 } \{a\ mod\ p,2*a\ mod\ p,3*a\ mod\ p,...,(p-1)*a\ mod\ p\}=\{1,2,3,...,p-1\} {a mod p,2∗a mod p,3∗a mod p,...,(p−1)∗a mod p}={1,2,3,...,p−1}
∴ 1 ∗ 2 ∗ 3 ∗ . . . ∗ ( p − 1 ) ≡ a ∗ 2 ∗ a ∗ 3 ∗ a ∗ . . . ∗ ( p − 1 ) ∗ a ( m o d p ) \therefore 1*2*3*...*(p-1)\equiv a*2*a*3*a*...*(p-1)*a(mod\ p) ∴1∗2∗3∗...∗(p−1)≡a∗2∗a∗3∗a∗...∗(p−1)∗a(mod p)
∴ ( p − 1 ) ! ≡ a p − 1 ∗ ( p − 1 ) ! ( m o d p ) \therefore (p-1)!\equiv a^{p-1}*(p-1)!(mod\ p) ∴(p−1)!≡ap−1∗(p−1)!(mod p)
∴ a p − 1 ≡ 1 ( m o d p ) \therefore a^{p-1}\equiv 1(mod\ p) ∴ap−1≡1(mod p)
时间复杂度: O ( l o g p ) O(log\ p) O(log p) 使用条件: a , p a,p a,p互质且 p p p为质数
三、欧拉函数
1.欧拉函数的定义
欧拉函数 Φ ( n ) \Phi(n) Φ(n)代表小于 n n n并且与 n n n互质的数的个数,特别的, Φ ( 1 ) = 1 \Phi(1)=1 Φ(1)=1。
2.欧拉函数的求法
Φ ( x ) = x ∗ ∏ i = 1 n ( 1 − 1 p i ) \Phi(x)=x*\prod_{i=1}^{n}(1-\frac{1}{p_i}) Φ(x)=x∗∏i=1n(1−pi1),其中 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn为 x x x所有的质因子;特别的, Φ ( 1 ) = 1 \Phi(1)=1 Φ(1)=1
如何理解这个式子呢?因为对于某一个质因数 p i p_i pi,在 1 1 1到 x x x中有 x p i \frac{x}{p_i} pix个数是 p i p_i pi的倍数,那么就有 x ∗ ( 1 − 1 p i ) x*(1-\frac{1}{p_i}) x∗(1−pi1)个数不是 p i p_i pi的倍数,对于所有 x x x的质因数 p i , p 2 , . . . , p n p_i,p_2,...,p_n pi,p2,...,pn考虑的话,就有 x ∗ ∏ i = 1 n ( 1 − 1 p i ) x*\prod_{i=1}^{n}(1-\frac{1}{p_i}) x∗∏i=1n(1−pi1)个数不是其中任何一个质因数的倍数,也就是与 x x x互质的数的数目,即 Φ ( x ) \Phi(x) Φ(x)
3.欧拉函数的性质
1)欧拉函数是积性函数,即满足:若 a , b a,b a,b互质,则 Φ ( a ∗ b ) = Φ ( a ) ∗ Φ ( b ) \Phi(a*b)=\Phi(a)*\Phi(b) Φ(a∗b)=Φ(a)∗Φ(b)(所以可以线性筛)
2)若 p p p为质数,则 Φ ( p ) = p − 1 \Phi(p)=p-1 Φ(p)=p−1
3)小于 n n n与 n n n互质的数的和为 Φ ( n ) ∗ n 2 \Phi(n)*\frac{n}{2} Φ(n)∗2n(n=1的时候不满足此性质)
4)若 p p p为质数,且 n = p k n=p^k n=pk,则 Φ ( n ) = p k − p k − 1 \Phi(n)=p^k-p^{k-1} Φ(n)=pk−pk−1
5) n = ∑ d ∣ n Φ ( d ) n=\sum_{d|n}\Phi(d) n=∑d∣nΦ(d),此公式在杜教筛中有很大用
上列性质的证明:
1)若 a , b a,b a,b互质,设 a , b a,b a,b所有质因数分别为 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} {a1,a2,...,an}, { b 1 , b 2 , . . . , b m } \{b_1,b_2,...,b_m\} {b1,b2,...,bm},且 ∀ i , j a i ≠ b j \forall i,j\ a_i\neq b_j ∀i,j ai=bj(因为$a,b $互质)
Φ ( a ) ∗ Φ ( b ) = a ∗ b ∗ ∏ i = 1 n ( 1 − 1 a i ) ∗ ∏ i = 1 m ( 1 − 1 b i ) = Φ ( a ∗ b ) \Phi(a)*\Phi(b)=a*b*\prod_{i=1}^{n}(1-\frac{1}{a_i})*\prod_{i=1}^{m}(1-\frac{1}{b_i})=\Phi(a*b) Φ(a)∗Φ(b)=a∗b∗∏i=1n(1−ai1)∗∏i=1m(1−bi1)=Φ(a∗b)
2) 1 , 2 , . . . , p − 1 1,2,...,p-1 1,2,...,p−1都与 p p p互质,所以 Φ ( p ) = p − 1 \Phi(p)=p-1 Φ(p)=p−1
3)若 ( a , n ) = 1 (a,n)=1 (a,n)=1,则有 ( n − a , n ) = 1 (n-a,n)=1 (n−a,n)=1(想一想,为什么?),所以与 n n n互质的数的平均数是 n / 2 n/2 n/2,而个数又是 Φ ( n ) \Phi(n) Φ(n),可以得到这些数的和就是 Φ ( n ) ∗ n / 2 \Phi(n)*n/2 Φ(n)∗n/2。
4)代入公式显然。
5)引理一:令 F ( x ) = ∑ d ∣ x Φ ( d ) F(x)=\sum_{d|x}\Phi(d) F(x)=∑d∣xΦ(d),则 F ( x ) F(x) F(x)为积性函数
证明:设 ( a , b ) = 1 (a,b)=1 (a,b)=1,则
F ( a ) ∗ F ( b ) = ∑ i ∣ a Φ ( i ) ∗ ∑ j ∣ b Φ ( j ) = Φ ( i 1 ) ∗ Φ ( j 1 ) + Φ ( i 1 ) ∗ Φ ( j 2 ) + . . . Φ ( i 2 ) ∗ Φ ( j 1 ) + Φ ( i 2 ) ∗ Φ ( j 2 ) + . . . + Φ ( i p ) ∗ Φ ( j q ) = Φ ( i 1 ∗ j 1 ) + Φ ( i 1 ∗ j 2 ) + . . . + Φ ( i 2 ∗ j 1 ) + Φ ( i 2 ∗ j 2 ) + . . . + Φ ( i p ∗ j q ) F(a)*F(b)=\sum_{i|a}\Phi(i)*\sum_{j|b}\Phi(j)\\ =\Phi(i_1)*\Phi(j_1)+\Phi(i_1)*\Phi(j_2)+...\Phi(i_2)*\Phi(j_1)+\Phi(i_2)*\Phi(j_2)+...+\Phi(i_p)*\Phi(j_q)\\ =\Phi(i_1*j_1)+\Phi(i_1*j_2)+...+\Phi(i_2*j_1)+\Phi(i_2*j_2)+...+\Phi(i_p*j_q) F(a)∗F(b)=i∣a∑Φ(i)∗j∣b∑Φ(j)=Φ(i1)∗Φ(j1)+Φ(i1)∗Φ(j2)+...Φ(i2)∗Φ(j1)+Φ(i2)∗Φ(j2)+...+Φ(ip)∗Φ(jq)=Φ(i1∗j1)+Φ(i1∗j2)+...+Φ(i2∗j1)+Φ(i2∗j2)+...+Φ(ip∗jq)
(这里排版bug了,也懒得改了)
不难看出 i 1 ∗ j 1 , i 1 ∗ j 2 . . . , i p ∗ j q i_1*j_1,i_1*j_2...,i_p*j_q i1∗j1,i1∗j2...,ip∗jq正好是 a ∗ b a*b a∗b的所有因数,就相当于是把 a a a的所有因数同时乘上 j 1 , j 2 , . . . , j q j_1,j_2,...,j_q j1,j2,...,jq,所得到的所有数必然是 a ∗ b a*b a∗b的所有因数,所以 F ( a ) ∗ F ( b ) = F ( a ∗ b ) F(a)*F(b)=F(a*b) F(a)∗F(b)=F(a∗b)得证, F ( x ) F(x) F(x)是积性函数因为 F ( x ) F(x) F(x)为积性函数,所以我们只需要观察 x = p k x=p^k x=pk的时候是否满足即可
F ( p k ) = Φ ( p 0 ) + Φ ( p 1 ) + . . . + Φ ( p k ) F(p^k)=\Phi(p^0)+\Phi(p^1)+...+\Phi(p^k) F(pk)=Φ(p0)+Φ(p1)+...+Φ(pk)
由性质(4)得, F ( p k ) = 1 + p 1 − p 0 + p 2 − p 1 + . . . + p k − p k − 1 = p k F(p^k)=1+p^1-p^0+p^2-p^1+...+p^k-p^{k-1}=p^k F(pk)=1+p1−p0+p2−p1+...+pk−pk−1=pk
因为 F ( x ) F(x) F(x)是积性函数,所以对于所有的正整数,都有 n = ∑ d ∣ n Φ ( d ) n=\sum_{d|n}\Phi(d) n=∑d∣nΦ(d),性质(5)得证
4.欧拉定理
一般的欧拉定理叙述为:对于 ∀ a , p \forall a,p ∀a,p,若 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,则 ∀ n , a n ≡ a n m o d Φ ( p ) ( m o d p ) \forall n,a^n\equiv a^{n\ mod\ \Phi(p)}(mod\ p) ∀n,an≡an mod Φ(p)(mod p)
当 n = Φ ( p ) n=\Phi(p) n=Φ(p)时,$a^{\Phi§}≡1(mod\ p) $(这玩意甚至可以直接推出费马小定理…)
证明:
欧拉定理的证明其实和费马小定理十分相似…
引理一:同费马小定理的引理一,如果 p , c p,c p,c互质 a ∗ c ≡ b ∗ c ( m o d p ) a*c\equiv b*c(mod\ p) a∗c≡b∗c(mod p),则有 a ≡ b ( m o d p ) a \equiv b(mod\ p) a≡b(mod p)
引理二:若 a , b a,b a,b与 p p p互质,则 a ∗ b a*b a∗b也与 p p p互质
证明:这条是显然(凑字数)的,因为 a ∗ b a*b a∗b不会多出任何 p p p的质因数,所以一定互质…
引理三:设小于 p p p并且与 p p p互质的数分别为 x 1 , x 2 , . . . , x Φ ( p ) x_1,x_2,...,x_{\Phi(p)} x1,x2,...,xΦ(p),且 p , c p,c p,c互质,则 c ∗ x 1 , c ∗ x 2 , . . . , c ∗ x Φ ( p ) c*x_1,c*x_2,...,c*x_{\Phi(p)} c∗x1,c∗x2,...,c∗xΦ(p)和它在模 p p p意义下等价
证明:由引理二, c ∗ x 1 , c ∗ x 2 , . . . , c ∗ x Φ ( p ) c*x_1,c*x_2,...,c*x_{\Phi(p)} c∗x1,c∗x2,...,c∗xΦ(p)一定都与 p p p互质,如果 ∃ i , j \exists i,j ∃i,j使得 c ∗ x i ≡ c ∗ x j ( m o d p ) c*x_i\equiv c*x_j(mod\ p) c∗xi≡c∗xj(mod p),由引理一, x i ≡ x j ( m o d p ) x_i\equiv x_j(mod\ p) xi≡xj(mod p),与假设矛盾,所以 c ∗ x 1 , c ∗ x 2 , . . . , c ∗ x Φ ( p ) c*x_1,c*x_2,...,c*x_{\Phi(p)} c∗x1,c∗x2,...,c∗xΦ(p)是 x 1 , x 2 , . . . , x Φ ( p ) x_1,x_2,...,x_{\Phi(p)} x1,x2,...,xΦ(p)的一组置换,在模 p p p意义下是等价的
欧拉定理证明:
∵ a , p \because a,p ∵a,p互质
由引理三,有 x 1 ∗ x 2 ∗ . . . ∗ x Φ ( p ) ≡ a ∗ x 1 ∗ a ∗ x 2 ∗ . . . ∗ a ∗ x Φ ( p ) ( m o d p ) x_1*x_2*...*x_{\Phi(p)}\equiv a*x_1*a*x_2*...*a*x_{\Phi(p)}(mod\ p) x1∗x2∗...∗xΦ(p)≡a∗x1∗a∗x2∗...∗a∗xΦ(p)(mod p)
∴ ∏ i = 1 Φ ( p ) x i ≡ a Φ ( p ) ∗ ∏ i = 1 Φ ( p ) x i ( m o d p ) \therefore \prod_{i=1}^{\Phi(p)}x_i\equiv a^{\Phi(p)}*\prod_{i=1}^{\Phi(p)}x_i(mod\ p) ∴∏i=1Φ(p)xi≡aΦ(p)∗∏i=1Φ(p)xi(mod p)
∴ a Φ ( p ) ≡ 1 ( m o d p ) \therefore a^{\Phi(p)}\equiv 1(mod\ p) ∴aΦ(p)≡1(mod p)
由欧拉定理,我们可以找出另一种逆元的求法, a a a在模 p p p意义下的逆元为 a Φ ( p ) − 1 a^{\Phi(p)-1} aΦ(p)−1
这一求法相较费马小定理,少了对 p p p是否为质数的限制,只需 a , p a,p a,p互质即可,这一条也是 a a a存在逆元的充要条件,所以用欧拉函数求逆元是最万能的方法(可惜没人用)
5.扩展欧拉定理
扩展欧拉定理的叙述为:对于 ∀ a , p \forall a,p ∀a,p若 g c d ( a , p ) ≠ 1 gcd(a,p)\neq 1 gcd(a,p)=1,则有
a n ≡ a n m o d Φ ( p ) ( m o d p ) a^n\equiv a^{n\ mod\ \Phi(p)}(mod\ p) an≡an mod Φ(p)(mod p),( n < Φ ( p ) n<\Phi(p) n<Φ(p))(屁话)
a n ≡ a n m o d Φ ( p ) + Φ ( p ) ( m o d p ) a^n\equiv a^{n\ mod\ \Phi(p)+\Phi(p)}(mod\ p) an≡an mod Φ(p)+Φ(p)(mod p),( o t h e r w i s e otherwise otherwise)
证法太麻烦,noip也不带考的,大家略微了解一下就好了!(如果非要看证法可以看另一篇课件)
6.欧拉函数的线性筛法
首先根据积性函数的性质,如果
i
,
j
i,j
i,j互质,则
Φ
(
i
∗
j
)
=
Φ
(
i
)
∗
Φ
(
j
)
\Phi(i∗j)=\Phi(i)∗\Phi(j)
Φ(i∗j)=Φ(i)∗Φ(j);
所以对于
i
m
o
d
p
r
i
m
e
j
≠
0
i\ mod\ prime_j\neq 0
i mod primej=0的情况,
Φ
(
i
∗
p
r
i
m
e
j
)
\Phi(i*prime_j)
Φ(i∗primej)直接等于
Φ
(
i
)
∗
Φ
(
p
r
i
m
e
j
)
\Phi(i)*\Phi(prime_j)
Φ(i)∗Φ(primej)即可。
对于 i m o d p r i m e j = 0 i\ mod\ prime_j=0 i mod primej=0的情况,考虑求解 Φ ( n ) \Phi(n) Φ(n)的公式,多乘一个 p r i m e j prime_j primej并不会多一个质因子,只有前面的 n n n多乘了一个 p r i m e j prime_j primej,所以这种情况 Φ ( i ∗ p r i m e j ) = Φ ( i ) ∗ p r i m e j \Phi(i*prime_j)=\Phi(i)*prime_j Φ(i∗primej)=Φ(i)∗primej
详细代码如下:
inline void prime_shaker(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!pd[i]) prime[++top]=i,phi[i]=i-1;
for(int j=1;j<=top && 1ll*prime[j]*i<=n;j++){
pd[i*prime[j]]=true;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
没错我大括号不换行,你打我啊~
中国剩余定理(crt)
简单的中国剩余定理
设有模线性方程组(S):
(
S
)
:
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
.
.
.
x
≡
a
n
(
m
o
d
m
n
)
(S) : \left \{ \begin{aligned} x& \equiv a_1(mod\ m_1)\\ x& \equiv a_2(mod\ m_2)\\ &...\\ x& \equiv a_n(mod\ m_n) \end{aligned} \right.
(S):⎩
⎨
⎧xxx≡a1(mod m1)≡a2(mod m2)...≡an(mod mn)
且
m
1
,
m
2
,
.
.
.
,
m
n
m_1,m_2,...,m_n
m1,m2,...,mn两两互质,中国剩余定理就是一个通过构造方式求解一组
x
x
x的算法
因为是构造,所以先直接告诉大家构造方式:
设 M = ∏ i = 1 n m i , M i = M / m i M=\prod^{n}_{i=1} m_i,M_i=M/m_i M=∏i=1nmi,Mi=M/mi, M i − 1 M^{−1}_i Mi−1为 M i M_i Mi在 m i m_i mi意义下的逆元,则通解 x = ∑ i = 1 n a i ∗ M i ∗ M i − 1 x=\sum ^{n}_{i=1}a_i∗M_i∗M^{−1}_i x=∑i=1nai∗Mi∗Mi−1
这个构造式应该怎么考虑呢?
通解 x x x可以看作是一堆奇怪东西的和( ∑ j = 1 n a j ∗ M j ∗ M j − 1 \sum_{j=1}^{n}a_j*M_j*M_j^{-1} ∑j=1naj∗Mj∗Mj−1),我们考虑这个和 x x x在第 i i i个方程组中是什么样的
对于 i ≠ j i\neq j i=j的项,相当于是 a j ∗ a_j* aj∗一个包含因数 m i m_i mi的数 ∗ * ∗另一个奇怪的数,这一项包含因数 m i m_i mi,所以在第 i i i个方程组的贡献是 0 0 0
对于 i = j i=j i=j的项,相当于是 a i ∗ M i ∗ M i − 1 = a i a_i*M_i*M_i^{-1}=a_i ai∗Mi∗Mi−1=ai,贡献是 a i a_i ai
所以 x m o d m i = 0 + 0 + . . . + 0 + a i = a i x\ mod\ m_i=0+0+...+0+a_i=a_i x mod mi=0+0+...+0+ai=ai,该构造成立
这个构造方式只能适用于 m i m_i mi两两互质的情况,且如果 ∏ i = 1 n m i \prod_{i=1}^nm_i ∏i=1nmi过大的话也不好计算,所以就有了扩展的中国剩余定理
扩展中国剩余定理(excrt)
前置技能:扩展欧几里得算法(exgcd)
扩展欧几里得算法不归我讲…所以我先只介绍下它的用处
扩展欧几里得算法可以快速求出 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组解 x , y x,y x,y,假设我们已经掌握了这个算法,那么我们来利用这个算法推一下中国剩余定理吧!
其实扩展crt特别简单…假设你搞出了前
k
k
k组的一个最小正整数解
x
x
x,想推出前
k
+
1
k+1
k+1个方程的解
令
M
=
∏
i
=
1
k
m
i
M=\prod_{i=1}^k m_i
M=∏i=1kmi,显然
∀
t
,
x
+
t
∗
M
\forall t,x+t*M
∀t,x+t∗M都是满足的
那么对于新的一组方程
x
≡
a
k
+
1
(
m
o
d
m
k
+
1
)
x\equiv a_{k+1}(mod\ m_{k+1})
x≡ak+1(mod mk+1)我们要找的是令
x
+
t
∗
M
≡
a
k
+
1
(
m
o
d
m
k
+
1
)
x+t*M\equiv a_{k+1}(mod\ m_{k+1})
x+t∗M≡ak+1(mod mk+1)最小的
t
t
t,
即
t
∗
M
+
m
k
+
1
∗
p
≡
a
k
+
1
−
x
t*M+m_{k+1}*p\equiv a_{k+1}-x
t∗M+mk+1∗p≡ak+1−x,可以轻松的利用exgcd求出最小解,若某时某刻exgcd无解,则原模线性方程组无解。
大致代码如下:
typedef long long LL;
LL calc(){
LL M=m[1],x=a[1];///第一组的解就是a[1],此时M之积为m[1]
for(int i=2;i<=n;i++){
LL g=gcd(M,m[i]),t=((a[i]%m[i]-x%m[i])%m[i]+m[i])%m[i];
if(t%g!=0) return -1;//判断exgcd是否有解
LL xx,y;
exgcd(M,m[i],xx,y);
xx=mul(xx,t/g,m[i]/g);//快速乘,防止爆long long
x=xx*M+x;
M=M*(m[i]/g);
x=(x%M+M)%M;
}
return x%M;
}
啊…数学真是太奇妙了!