• hdu 1788 Chinese remainder theorem again(最小公倍数)


    Problem Description

    我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的:
    假设m1,m2,…,mk两两互素,则下面同余方程组:
    x≡a1(mod m1)
    x≡a2(mod m2)

    x≡ak(mod mk)
    在0<=<m1m2…mk内有唯一解。
    记Mi=M/mi(1<=i<=k),因为(Mi,mi)=1,故有二个整数pi,qi满足Mipi+miqi=1,如果记ei=Mi/pi,那么会有:
    ei≡0(mod mj),j!=i
    ei≡1(mod mj),j=i
    很显然,e1a1+e2a2+…+ekak就是方程组的一个解,这个解加减M的整数倍后就可以得到最小非负整数解。
    这就是中国剩余定理及其求解过程。
    现在有一个问题是这样的:
    一个正整数N除以M1余(M1- a),除以M2余(M2-a), 除以M3余(M3-a),总之, 除以MI余(MI-a),其中(a<Mi<100i=1,2,…I),求满足条件的最小的数。 

     

     

    Input

    输入数据包含多组测试实例,每个实例的第一行是两个整数I(1<I<10)和a,其中,I表示M的个数,a的含义如上所述,紧接着的一行是I个整数M1,M1...MI,I=0并且a=0结束输入,不处理。

     

     

    Output

    对于每个测试实例,请在一行内输出满足条件的最小的数。每个实例的输出占一行。

     

     

    Sample Input

    2 1

    2 3

    0 0

     

     

    Sample Output

    5

     /******************************

    这题太坑了,题目写的是  Chinese remainder theorem,却明明是最小公倍数。。。

    分析:M%M1 = M1-a,M%M2 = M2-a,M%M3 = M3-a,……,M%Mi = Mi-a

          即:(M+a) %M1 = 0,(M+a) %M2 = 0,(M+a) %M3 = 0,……,(M+a) %Mi = 0,

          即: M+a  是M1,M2,M3,……,Mi的一个最小公倍数。。

    好了,求最小公倍数吧!!

    //  将hdu 1019 的代码稍微改了一下,注意要使用__int64,int不行。。。

    ****************************************/


    Code:

    #include <iostream>
    #include<string.h>
    using namespace std;
    __int64 gcd(__int64 a,__int64 b)//求最大公约数
    {
        __int64 temp;
        if(a<b)
        {
            temp = a;a = b;b = temp;
        }
        return (b==0)?a:gcd(b,a%b);
    }
    __int64 LCM(__int64 a,__int64 b)//求最小公倍数
    {
        return a/gcd(a,b)*b; 
    }
    int main()
    {
        __int64 n,ans,x,a;
        while(cin>>n>>a&&n&&a)
        {
            //memset(a,0,sizeof(a));
            ans = 1;
            cin>>x;
            ans = LCM(ans,x);
            for(int i = 0;i<n-1;i++)
            {
                cin>>x;
                ans = LCM(ans,x);
            }
            ans-=a;
            cout<<ans<<endl;
        }
    
        return 0;
    }



  • 相关阅读:
    git
    sublime text
    WIX安装图文并茂简易说明
    C#利用Lambda和Expression实现数据的动态绑定
    Ubuntu/CentOS下如何将普通用户提升到root权限
    虚拟机安装CentOS6.4用“桥接:直接连接到物理网线”不能上网的原因及解决方法
    C#利用lambda表达式将函数作为参数或属性跨类传递
    直接将XML存入到SQL中(SQL2008)
    C# 类中继承接口的属性
    提高开发效率的Visual Studio 2010使用技巧
  • 原文地址:https://www.cnblogs.com/gray1566/p/3704316.html
Copyright © 2020-2023  润新知