中国剩余定理(chinese remainder theorem)【模板】

来源:互联网 发布:java项目流程图工具 编辑:程序博客网 时间:2024/06/05 06:42
#include <iostream>#include<cstdio>#include<cstring>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;}

0 0
原创粉丝点击