例1:一个数被3除余1,被4除余2,被5除余4,这个数最小是几? 题中3、4、5三个数两两互质。 则〔4,5〕=20;〔3,5〕=15;〔3,4〕=12;〔3,4,5〕=60。 为了使20被3除余1,用20×2=40; 使15被4除余1,用15×3=45; 使12被5除余1,用12×3=36。 然后,40×1+45×2+36×4=274, 因为,274>60,所以,274-60×4=34,就是所求的数。
例2:一个数被3除余2,被7除余4,被8除余5,这个数最小是几? 题中3、7、8三个数两两互质。 则〔7,8〕=56;〔3,8〕=24;〔3,7〕=21;〔3,7,8〕=168。 为了使56被3除余1,用56×2=112; 使24被7除余1,用24×5=120。 使21被8除余1,用21×5=105; 然后,112×2+120×4+105×5=1229, 因为,1229>168,所以,1229-168×7=53,就是所求的数。
例3:一个数除以5余4,除以8余3,除以11余2,求满足条件的最小的自然数。 题中5、8、11三个数两两互质。 则〔8,11〕=88;〔5,11〕=55;〔5,8〕=40;〔5,8,11〕=440。 为了使88被5除余1,用88×2=176; 使55被8除余1,用55×7=385; 使40被11除余1,用40×8=320。 然后,176×4+385×3+320×2=2499, 因为,2499>440,所以,2499-440×5=299,就是所求的数。
例4:有一个年级的同学,每9人一排多5人,每7人一排多1人,每5人一排多2人,问这个年级至少有多少人 ?(幸福123老师问的题目) 题中9、7、5三个数两两互质。 则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。 为了使35被9除余1,用35×8=280; 使45被7除余1,用45×5=225; 使63被5除余1,用63×2=126。 然后,280×5+225×1+126×2=1877, 因为,1877>315,所以,1877-315×5=302,就是所求的数。
例5:有一个年级的同学,每9人一排多6人,每7人一排多2人,每5人一排多3人,问这个年级至少有多少人 ?(泽林老师的题目) 题中9、7、5三个数两两互质。 则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。 为了使35被9除余1,用35×8=280; 使45被7除余1,用45×5=225; 使63被5除余1,用63×2=126。 然后,280×6+225×2+126×3=2508, 因为,2508>315,所以,2508-315×7=303,就是所求的数。 (例5与例4的除数相同,那么各个余数要乘的“数”也分别相同,所不同的就是最后两步。)
|
|
先写出一个两位数62,接着在62右端写这两个数字的和为8,得到628,再写末两位数字2和8的和10,得到62810,用上述方法得到一个有2006位的整数:628101123……,则这个整数的数字之和是( )。
(2006-5)÷10=200....1
17+35*200+1=7018
前面的62810数字和为17
后面开始,以“1123581347”为循环节
共循环10次,每次的和为35
最后余1,就加上1
所以结果是17+35*200+1=7018
例子:PKU 1006
因为只有三个数23 28 33 且三个数两两互为质数,所以“中国剩余定理”可知
对于每一组输入数据p, e ,i, d,所求结果为:n = (R1*p + R2*e + R3*i)%21252-d
其中 R1%p=1, R2%e=1, R3%i=1;
R1 = 5544 = 28*33* 6; //28 33 的公倍数中能被23除余1的最小整数
R2 = 14221 = 23*33*19; //23 33 的公倍数中能被28除余1的最小整数
R3 = 1288 = 23*28* 2; //23 28 的公倍数中能被33除余1的最小整数
为了保证结果大于等于1且小于等于21252,结果修正为:n = (R1*p + R2*e + R3*i - d + 21252)%21252,并且如果n为0,则n = 21252为所求。
问题简单来说就是 a = ai (mod ni) 求未知数a,
以下小结略去证明, 只是对定理作了必要的解释, 要了解相关定理,可查阅数论资料.
中国余数定理:
设
n=n1*n2...nk, 其中因子两两互质.有: a-----(a1,a2,...,ak), 其中ai = a mod ni, 则
a和(a1,a2,...,ak)关系是一一对应的.就是说可以由 a求出(a1,a2,...,ak), 也可以由(a1,a2,...,ak)求出a
推论1:
对于 a=ai (mod ni) 的同余方程,有唯一解
下面说说由(a1, a2, ..., ak)求a的方法:
定义 mi = n1*n2*...nk / ni; ci = mi(mf mod ni); 其中 mi*mf mod ni = 1;
则 a = (a1*c1+a2*c2+...+ak*ck) (mod n) (注:由此等式可求a%n, 当n很大时)
中国剩余定理关键是mf的求法,如果理解了扩展欧几里得 ax+by=d, 就可以想到:
mi*mf mod ni = 1 => mi*mf+ni*y=1;
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 100;
int nn, a[MAXN], n[MAXN];
int egcd(int a, int b, int &x, int &y) {
int d;
if (b == 0) {
x = 1; y = 0;
return a;
} else {
d = egcd(b, a%b, y, x);
y -= a/b*x;
return d;
}
}
int lmes() {
int i, tm=1, mf, y, ret=0, m;
for (i=0; i<nn; i++) tm *= n[i];
for (i=0; i<nn; i++) {
m = tm/n[i];
egcd(m, n[i], mf, y);
ret += (a[i]*m*(mf%n[i]))%tm;
}
return (ret+tm)%tm;
}