CRT中国剩余定理

特别版(除数两两互质)

void ex_gcd(int a, int b, int &x, int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    else
    {
        int x1, y1;
        ex_gcd(b, a%b, x1, y1);
        if(a*b<0)
        {
            x=-y1;
            y=a/b*y1-x1;
        }
        else
        {
            x=y1;
            y=x1-a/b*y1;
        }
    }
}

ll CRT(int a[], int m[], int len)//a[ ]余数,m[ ]除数
{
    int N[10];
    int lca=1;
    int res=0;
    for(int i=0; i<len; i++)
        lca*=m[i];
    for(int i=0; i<len; i++)
    {
        int L, J;
        ex_gcd(lca/m[i], -m[i], L, J);
        N[i]=J*m[i]+1;
        res+=N[i]*a[i];
    }
    return (res%lca+lca)%lca;
}

普通版(任意情况)
两两合并变成互质情况。

void exgcd(ll a, ll b, ll &x, ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    exgcd(b, a%b, x, y);
    ll t=x;
    x=y;
    y=t-(a/b)*y;
    return ;
}

ll CRT(int n)
{
    ll c, d, x, y;
    ll M=m[1], R=r[1];
    for(int i=2; i<=n; i++)
    {
        d=gcd(M, m[i]);
        c=r[i]-R;
        if(c%d) return -1;
        exgcd(M/d, m[i]/d, x, y);
        x=(c/d*x)%(m[i]/d);
        R=R+x*M;
        M=M/d*m[i];
        R%=M;
    }
    if(R<0) R+=M;
    return R;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,646评论 0 5
  • 楔子 酒馆掌柜刚给几个来避雨的客人上了一壶热酒,转身就看见一个人急忙忙冲进店里。 “掌柜的,来壶酒。” 那人将身上...
    浮生未歇_1a7c阅读 237评论 0 0
  • 技术大会总免不了要展示代码的大家有没有遇到过,进行代码演示的时候观众抱怨看不清呢?下面我就分享下「如何使用keyn...
    杜小龙阅读 4,401评论 0 4
  • 简书的简介上说,这里有你志同道合的人, 简书还说,会给你心灵的慰藉, 我希望在这里找到一片净土, 希望在这里找到一...
    茉槐槡阅读 170评论 0 0