Vision_MATH_中国剩余定理

来源:互联网 发布:采购流程及优化 编辑:程序博客网 时间:2024/05/22 04:39
///定义:
/*
    中国剩余定理给出了以下的一元线性同余方程组:
    x ≡ a1 (mod m1)
    x ≡ a2 (mod m2)
    x ≡ a3 (mod m3)
    x ≡ a4 (mod m4)
        *
        *
        *
    x ≡ ak (mod mk)


*/

///代码:

/***name:中国剩余定理**function:求解一元线性同余方程组**条件:m1,m2,m3....mk两两互素**输入参数:m集合+a集合**输出参数:最小正整数解*/#include <iosteam>#include <bits/stdc++.h>using namespace std;typedef long long LL;///扩展欧几里得void gcd(LL a,LL b,LL &d,LL &x,LL &y){    if(b==0){        d = a;        x = 1;        y = 0;    }    else {        gcd(b,a%b,d,y,x);        y-=(a/b)*x;    }}///中国剩余定理LL China(int n,LL *m,LL *a){    LL M = 1,d,y,x;    LL ret = 0;    for(int i = 0;i<n;i++)M*=m[i];    for(int i = 0;i<n;i++){        LL w = M/m[i];        gcd(m[i],w,d,x,y);        ret = (ret+y*w*a[i])%M;    }    return (M+ret%M)%M;}LL m[15],a[15];int main(){    int n;    cin>>n;    for(int i = 0;i<n;i++){        cin>>m[i]>>a[i];    }    cout<<China(n,m,a)<<endl;    return 0;}

/***name:中国剩余定理**function:求解一元线性同余方程组**条件:m1,m2,m3....mk不互素**来源:HDU 1573**输入参数:m集合+a集合**输出参数:最小正整数解(有解)||无解flag*/#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>using namespace std;int T,n,s,M,ans,flag,a[15],m[15];inline int read(){    int x=0,f=1;  char ch=getchar();    while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}    while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}    return x*f;}void exgcd(int a,int b,int &g,int &x,int &y){    if(b==0)  {x=1; y=0; g=a; return;}    exgcd(b,a%b,g,x,y);    int t=x;x=y;y=t-a/b*y;}void China(){    int A=a[1],k,y;  M=m[1];    for(int i=2;i<=n;i++){        int da=a[i]-A,g;        exgcd(M,m[i],g,k,y);        if(da%g)  {flag=1; return;}///对于方程m1*x+m2*y=c,如果c不是d的倍数就无整数解        int t=m[i]/g;        k*=da/g;        k=(k+t)%t;        A+=k*M;        M=M*m[i]/g;        A=(A+M)%M;    }    ans=A;///大于等于0的最小正整数解}int main(){    /*    返回的参数有flag和ans    flag判断是否有解    */    flag=0;    for(int i=1;i<=n;i++)  m[i]=read();    for(int i=1;i<=n;i++)  a[i]=read();    China();}

///扩展:
/*
    通解公式:X = X0+k*M;(M = LCM(m1,m2,m3,,,mk))
*/