(扩展)中国剩余定理

中国剩余定理又称孙子定理或者简称crt,是用于求解同余方程组的一种方法。

中国剩余定理:

在这里插入图片描述
crt有特殊要求,就是m1,m2,…mn都要互质,求最小的x。
此时令M = m1 * m2 mn。Mi = M / m,构造n个方程组,Mi x ≡ 1(mod mi) ,这里的x就相当于Mi在modmi下的逆元,exgcd就能解决。
再构造 bi = Mi * xi,由于bi ≡ 1 (mod mi),所以 bi * ai ≡ ai(mod mi)。
也就是说 x = (∑ni=1 ai * b i)。

扩展中国剩余定理

对于excrt来说就没有限制mi是互质的了,对任意两个方程做crt的步骤合并,之后继续做下去,直到剩下一个方程,再求这个同余方程的解就可以了。
这里推荐一个大佬的博客 http://blog.miskcoo.com/2014/09/chinese-remainder-theorem#i-4 ,讲的非常详细。

#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 100000+10;
int n;
ll m[N],a[N];
ll exgcd(ll a, ll b, ll &x,ll &y)
{
    if(b == 0)
    {
        x = 1,y = 0;
        return a;
    }
    ll ret = exgcd(b, a%b, y, x);
    y -= (a / b) * x;
    return ret;
}
ll excrt()
{
    ll M = m[1], A = a[1], x, y, d;
    for(int i = 2; i <= n; i++)
    {
        d = exgcd(M, m[i], x, y);
        if((A - a[i]) % d)
            return -1;
        x = (A - a[i]) / d * x % a[i];
        A -= M * x;
        M = M / d * a[i];
        A %= M;
    }
    return (A % M + M) % M;
}

你可能感兴趣的:(数学理论)