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;
}

  

posted @ 2012-08-02 10:23  77695  阅读(746)  评论(0编辑  收藏  举报