zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

    本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
    独立博客:http://nfeng.cc/
  • 相关阅读:
    几种常见的Map的区别
    BlockingQueue详解
    Android开发过程中内存泄露检测
    Android studio 技巧设置(持续更新中)
    Android Support兼容包详解
    单例模式的饿汉式为什么需要双重锁定
    View分析
    Activity的启动流程分析
    LeetCode第十四题-字符串数组中最长的共同前缀
    LeetCode第十三题-将罗马数字转化为数字
  • 原文地址:https://www.cnblogs.com/cj695/p/2619465.html
Copyright © 2011-2022 走看看