中国剩余定理

#include <iostream>
using namespace std;

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

int Chinese_Remainder(int a[],int w[],int len)    //中国剩余定理  a[]存放余数  w[]存放两两互质的数
{
    int i,d,x,y,m,n,ret;
    ret=0;
    n=1;
    for (i=0;i<len;i++)
        n*=w[i];
    for (i=0;i<len;i++)
    {
        m=n/w[i];
        d=Extended_Euclid(w[i],m,x,y);
        ret=(ret+y*m*a[i])%n;
    }
    return (n+ret%n)%n;
}


int main()
{
    int n,i;
    int w[15],b[15];
    while (scanf("%d",&n),n)   
    {
        for (i=0;i<n;i++)
        {
            scanf("%d%d",&w[i],&b[i]);
        }
        printf("%d/n",Chinese_Remainder(b,w,n));
    }
    return 0;
}
 

posted @ 2018-10-10 17:32  hum0r0  阅读(5)  评论(0)    收藏  举报