我国有一本数学古书「孙子算经」有这样一道问题:「今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二。问物几何?」
  
此题的意思是:有一批物品,三个三个地数,剩两个;五个五个地数,剩三个;七个七个地数,剩两个。问这批物品至少有多少个?
  
术曰:「三三数之剩二,置一百四十,五五数之剩三,置六十三,七七数之剩二,置三十,并之,得二百三十三,以二百一十减之,即得。凡三三数之剩一,则置七十,五五数之剩一,则置二十一,七七数之剩一,则置十五,即得。」
  
这是解答。意思是2×70+3×21+2×15=233,233-105-105=23.
  
后面是法则, 明代数学家程大位在其<算法统宗>里用口诀“:三人同行七十稀,五树梅花廿一,七子团圆月正半,除百零五便得知.”表达的。
  
这个口诀的意思是:把用3除所得的余数乘以70,加上用5除所得的余数乘以21,再加上用7除所得的余数乘以15,结果若是比105大,就减去105的倍数,便得所求的数。
  
这就是被称之为“中国剩余定理”。


中国剩余定理

设m1,m2,...,mk两两互质,则下面的同余方程组:
  x = a1 (mod m1)
  x = ak (mod mk)
    .
    .
    .
  x = ak (mod mk)
在0<=x<M = m1*m2*...*mk内有唯一解。
记Mi = M / mi (1<=i<=k) ,因为(Mi,mi)=1,故有两整数pi,qi满足Mi*pi + mi*qi = 1,
如果记ei = Mi*pi ,那么有
ei = 0 (mod mj) , j<>i
   = 1 (mod mj) , j==i
   
很显然,e1*a1 + e2*a2 + ... + ek*ak 就时方程组的一个解 ,
这个解%M后就得到了最小的非负整数解

求ei 我们就可以用扩展的欧几里得算法做。。。。

下面贴一个中国剩余定理的模板吧
C/C++代码: