首页 > 代码库 > 中共剩余定理

中共剩余定理

#include<iostream>
#include<stdio.h>
using namespace std;
#define LL __int64
#define ll I64 
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        exgcd(b,a%b,d,y,x);
        x=-1*x;
        y=-1*y;
        y+=(a/b)*x;
    }    
    return ;
    
}
int main()
{
    LL k,a1,r1,a2,r2,d,x,y;
    while(scanf("%lld",&k)!=EOF)
    {
        LL flag=1;
        scanf("%lld%lld",&a1,&r1);
        for(LL i=1;i<k;i++)
        {
            scanf("%lld%lld",&a2,&r2);
            exgcd(a1,a2,d,x,y);
            if((r2-r1)%d)
                flag=0;
            if(flag)
            {
                x=(r2-r1)/d*x;
                y=a2/d;
                x=(x%y+y)%y;
                r1=x*a1+r1;
                a1=(a1*a2)/d;
            }
        }
        exgcd(1,a1,d,x,y);
        if(r1%d)
            flag=0;
        if(flag==0)
            printf("-1\n");
        else
        {
            x=r1/d*x;
            y=a1/d;
            x=(x%y+y)%y;
            printf("%lld\n",x); 
        }
    }
    return 0;
}

 

中共剩余定理