//用中国剩余定理解决韩信点兵问题 #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; }