scau 1077 韩信点兵

//用中国剩余定理解决韩信点兵问题

#include <stdio.h>

long long max,x,m[8],b[8],M[8],n,N;

int p[8];





int main()

{

    int i,j,k;

    for(n=1,i=0; i<8; i++)

    {scanf("%lld",&m[i]);  n=n*m[i];}  //读入除数数组,注意n,为所以除数的乘积

    

    /***************检验n和m[]数组***************/

    //printf("%lld\n",n);

    //for(i=0; i<8; i++)

    //    printf("%lld ",m[i]);

    //printf("\n");                 //成功

    /***************检验n和m[]数组***************/

    

    

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

        scanf("%lld",&b[i]);          //读入余数数组

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

        M[i]=n/m[i];                    //保存M数组

    /****************检验b[]和M[]数组*******************/

    //for(i=0 ; i<8; i++)

    //    printf("%lld  %lld\n",b[i],M[i]);

    //printf("\n");                        //成功

    /****************检验b[]和M[]数组*******************/

    

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

    {

        for(k=1; ;k++)

            if(  (k*M[i])%m[i]==1)

            {p[i]=k;  break;}

    }



    /*******************输出p[]数组验证*******************************/

    //for(i=0; i<8; i++) printf("%lld ",p[i]); printf("\n");

    /*******************输出p[]数组验证*******************************/

    

    for(N=0,i=0; i<8; i++)

        N=(N+p[i]*M[i]*b[i]);



    

    

    //printf("%lld\n",N);

    //printf("%lld\n",n);

    x=N%n;

    for(max=m[0],i=0; i<8; i++)

    {

        if(m[i]>max) max=m[i];

    }

    if(x<max)  x=x+n;

    printf("%lld\n",x);

    /*for(N=0,i=0; i<8; i++)

        N=N+p[i]*M[i]*b[i];

    x=N%n;

    printf("%lld\n",x);*/

    return 0;

}

你可能感兴趣的:(ca)