hdu1573中国剩余问题定理模数非互质的的情况

依旧没弄懂。。先会用模版再说。。

注意讨论(ans==-1)的情况

#include<iostream>

#define llint long long int

using namespace std;

const int MAXM=12;



llint exgcd(llint a, llint b, llint &x, llint &y)

{

   if(b == 0){ x = 1, y = 0; return a;}

   llint r = exgcd(b, a % b, x, y);

   llint tmp = x;    x = y;  y = tmp - a/b * y;

   return r;

}

long long int lcm(long long int a,long long int b)

{

    llint x,y;

    return (a*b)/(exgcd(a,b,x,y));

}

llint crr(llint mm[],llint rr[],llint n)

{

    llint m1=mm[0];

    llint r1=rr[0];

    llint i; 

    bool flag;

    for ( i = 0; i < n - 1; i++)    

    {

        llint m2=mm[i+1];

        llint r2=rr[i+1];   

        if (flag) 

            continue;   

        llint x,y;

        llint d = exgcd(m1,m2,x,y);   

        llint c = r2 - r1; 

        if (c % d)      

        {       

            flag = 1;    

            continue;   

        }

        llint t=m2/d;    

        x=(c/d*x%t+t)%t;   

        r1=m1*x+r1;    

        m1=m1*m2/d;    

    }

    if(!flag)

    {

        if (r1==0&&n>1)

        {

            r1=mm[0];

            __int64 ans=1;

            llint x,y;

            for (i=1;i<n;i++)

            {

                r1=exgcd(mm[i],r1,x,y);

            }

            for ( i=0;i<n;i++)

            {

                ans*=mm[i];

            }

            r1=ans/r1;

        }

        if (r1==0&&n==1)

            r1=mm[0];

        return r1;

    }else

    {

        return -1;

    }

}



int main()

{

    llint T;

    cin>>T;

    while(T--)

    {

        llint N,M;

        llint a[MAXM],b[MAXM];

        cin>>N>>M;

        llint i;

        llint mt=1;

        for(i=0;i<=M-1;i++)

        {

            cin>>a[i];

            mt=lcm(mt,a[i]);

        }

        for(i=0;i<=M-1;i++)

        {

            cin>>b[i];

        }

        

        llint ans=crr(a,b,M);

   //     cout<<ans<<"|"<<mt<<endl;

        if(ans==-1)

        {

            cout<<0<<endl;

            continue;

        }

        if(ans<N)

        {

            cout<<(N-ans)/mt+1<<endl;

        }else

        {

            cout<<0<<endl;

        }

        //cout<<(N-ans)/mt<<endl;

    }

    return 0;

}

  

你可能感兴趣的:(HDU)