#include<stdio.h>
int mod(int c[],int b[],int n)
{
int all_multy=1,sum=0;
int i,j,x[5];
for(i=0;i<n;i++)
all_multy*=c[i];
for(i=0;i<n;i++)
x[i]=all_multy/c[i];
for(i=0;i<n;i++)
{
j=1;
while((x[i]*j)%c[i]!=1)
j++;
x[i]*=j;
}
for(i=0;i<n;i++)
sum+=(b[i]*x[i]);
return sum%all_multy;
}
int main()
{
int n,c[5],b[5],i;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
scanf("%d%d",&c[i],&b[i]);
printf("%d/n",mod(c,b,n));
}
return 0;
}
/*假设你现在需要数数篮子里有多少个鸡蛋.尽管数数是件很容易的事情,但不幸的是,你不能一个一个地去数,相反地,你要c个c个(即若干个)地去数,c>1.举个例子,如果你3个3个地去数篮子的鸡蛋,那么最后篮子里会剩下1个鸡蛋;如果你5个5个地去数,那么篮子里最后会剩下3个鸡蛋;如果你7个7个地数,篮子里又会剩下1个鸡蛋.你的任务就是计算出篮子里原来究竟有多少个鸡蛋.
Input Specification(输入详述)
输入将包含若干个测试案例.每个测试案例的第一行只有一个整数N(1<=N<=5),然后接下来的N行,第一行包括两个整数ci和bi(3<=ci<=49,0<=bi<=ci-1,ci是第一个数字).这两个数代表你ci个ci个地数鸡蛋,最终剩下bi个鸡蛋.当N=0时标志着测试案例输入的结束,你不用做任何处理.
Output(输出详述)
对每一个测试案例,你要在每一行上输出一个篮子里可能的最小的鸡蛋数.
解题思路:
看完题目,勿庸置疑,是中国剩余定理的应用.
关于中国剩余定理,有一个广为流传的典故"韩信点兵":
韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝的建立了卓绝的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了保住军事机密,不让敌人知道自己部队的实力,先令士兵从1至3报数,然后记下最后一个士兵所报之数;再令士兵从1至5报数,也记下最后一个士兵所报之数;最后令士兵从1至7 报数,又记下最后一个士兵所报之数;这样,他很快就算出了自己部队士兵的总人数,而敌人则始终无法弄清他的部队究竟有多少名士兵。而韩信点兵的计算方法就是中国剩余定理的一次同余式解法.
而《孙子算经》中的"物不知数"题目,也是中国剩余定理的应用,题目如下:
"今有一些物不知其数量。如果三个三个地去数它,则最后还剩二个;如果五个五个地去数它,则最后还剩三个;如果七个七个地去数它,则最后也剩二个。问:这些物一共有多少?"
用简练的数学语言来表述就是:求这样一个数,使它被3除余2,被5除余3,被7除余2。《孙子算经》给出了这道题目的解法和答案,用算式表示即为:
70*2 + 21*3 +15*2 - 105*2 =23
解题步骤如下:
1.三个质数中两个相乘取得值
则〔3,7〕=21;〔3,5〕=15;〔5,7〕=35;〔3,5,7〕=105
2.值的倍数除以另外一个数字必须余数为1
使35 被3除余1,用35×2=70
使21 被5除余1,用21×1=21
使15 被7除余1,用15×1=15
3. 与余数相乘之和
被3除余2,被5除余3,被7除余2
使35被3除余1,用35×2=70; 70×2 (被3除余2) //70=2*5*7=1(mod3)
使21被5除余1,用21×3=63; 21×3 (被5除余3) //21=3*7=1(mod5)
使15被7除余1,用15×2=30; 15×2 (被7除余2) //15=3*5=1(mod7)
70×2+21×3+15×2=233
4. 得出结果
上一步骤所得结果(233)除以 105 (3×5×7=105) 得余数即所需答案
233 / 105 = 2 余数是 23
所以,70*2 + 21*3 +15*2 - 105*2 =23
(上面说的废话有点多了,嘿嘿~~中国剩余定理别的资料大家就自个上网搜吧!)
好了,下面给出中国剩余定理的定义:
设m1,m2,...mn是两两互素的正整数,
则x≡bi mod mi(i=1,2,...n)在模m1m2m3...mn下有唯一解。
这M=m1m2....mn,Mj=M/mj,且Mjyj≡1 mod mj(j=1,2,...n),
则x=b1M1y1+b2M2y2+...+bnMnyn mod m1m2m3...mn即是符合条件的解。(大家可以根据定义来手动算一算孙子兵法那道题,解题步骤我在上面已经给出来了,共4点)
根据定义就能写出中国剩余定理的程序来了,附上代码(函数ch_mod()就是求解中国剩余定理):*/