数论学习三之——中国剩余定理

所谓中国剩余定理,实际上就是同余方程组,下面我们给出中国剩余定理的定义:
The Chinese Remainder Theorem: n 1 , n 2 , . . . , n k n_1,n_2,...,n_k 是两两互素的正整数,则我们可以得到同余方程组
a a 1 m o d    n 1 a a 2 m o d    n 2 a\equiv a_1\mod n_1 \\ a\equiv a_2\mod n_2 \\ \cdots
a a k m o d    n k a\equiv a_k\mod n_k
有模 n = n 1 n 2 . . . n k n=n_1n_2...n_k 的唯一解
同余方程组可以转换为多项式 a = ( a 1 c 1 + . . . a i c i + . . . a k c k ) a=(a_1*c_1+...a_i*c_i+...a_k*c_k) .由这个多项式我们可以直接求出 a a 来。
这个时候我们又遇到了个问题,怎么求出 c i c_i
c i = m i m i 1 c_i=m_i*m_i^{-1} (证明咱就不证了,嘿嘿嘿)
注意:这里的 m i 1 m_i^{-1} 并不是 1 m i \frac{1}{m_i} 而是 m i m_i 的逆元
其实中国剩余定理本身并没有模板,给出的一个同余方程组,关键在于逆元的求解,那么逆元是什么意思的,这就是解释——设 m i 1 m_i^{-1} m i m_i 的逆元, 那么 ( a m i ) % p = ( a m i 1 ) % p (\frac{a}{m_i})\%p = (a*m_i^{-1})\%p (再次强调这里的 m i 1 m_i^{-1} m i m_i 的逆元)
下面我们给出几种求逆元的方法:

一、蒙哥马利快速幂求逆元
(注意:只有当p为质数的时候才能用,所以快速幂求逆元有很大的局限性)

typedef long long ll;
ll q_pow(ll a, ll b, ll m)		//快速幂
{
    long long ans = 1;
    while(b)
    {
        if(b&1)
        {
            ans = (ans * a) % m;
        }
        a = (a * a) % m;
        b >>= 1;
    }
    return ans;
}

ll get_inv(ll x, ll p) 		//逆元求解
{ 
	return bin(x, p - 2, p); 
}

二、扩展欧几里得求逆元

ll exgcd(ll a, ll b, ll &x, ll &y)		//扩展欧几里得算法
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	ll d = exgcd(b, a % b, x, y);
	ll t = x;
	x = y;
	y = t - a / b * y;
	return d;
}

ll get_inv(ll a, ll M) 		//扩欧求逆元
{ 
	static ll x, y; 
	assert(exgcd(a, M, x, y) == 1); 
	return (x % M + M) % M; 
}

然后以后遇到这种类型的题目,又是套模板了,嘿嘿嘿!
如下给出典型例题:
P O J POJ 1006
H D O J HDOJ 4569

猜你喜欢

转载自blog.csdn.net/qq_43704563/article/details/102528754