若m1,m2,m3,m4,m5,…,mr是两两互素的正整数,则同余方程组
x=a1(mod m1)
x=a2(mod m2)
x=a3(mod m3)

x=ar(mod mr)
有模 M=m1m2m3…mr的唯一解,即为中国剩余定理。
大概思想就是把解用几个数的和的形式来表示,然后利用拓展欧几里得解方程,依次求出表达式中的每个数。

中国剩余定理解线性同余方程组(解某类线性同余方程组)

poj 1006
hdu 1788

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
    int l,a;
    while(scanf("%d%d",&l,&a),l!=0||a!=0)
    {
        long long ans=1,m;
        for(int i=1;i<=l;i++)
        {
            scanf("%lld",&m);
            ans=ans*m/__gcd(ans,m);
        }
        printf("%lld\n",ans-a);
    }
    return 0;
}

fzu1402
模板:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
ll a[12],b[12];
int n;
ll _gcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll ans=_gcd(b,a%b,x,y);
    ll tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return ans;
}
ll crt()
{
    ll M=1,ans=0;
    for(int i=1;i<=n;i++)
        M*=a[i];
    for(int i=1;i<=n;i++)
    {
        ll mi=M/a[i];
        ll x,y;
        ll gcd=_gcd(mi,a[i],x,y);
        ans=(ans+mi*b[i]*x)%M;
    }
    if(ans<0)
        ans+=M;
    return ans;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%I64d%I64d",&a[i],&b[i]);
        printf("%I64d\n",crt());//用%lld会WA
    }
    return 0;
}