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;
}
posted @ 2012-11-23 19:24  Titanium  阅读(585)  评论(3编辑  收藏  举报