同模余定理
- 定义:
所谓的同余,顾名思义,就是许多的数被一个数 d 去除,有相同的余数。d 数学上的称谓为模。如 a = 6, b = 1, d = 5, 则我们说 a 和 b 是模 d 同余的。因为他们都有相同的余数 1 。
- 数学上的记法为:
a≡ b(mod d)
- 三种说法等价
(1) a 和 b 是模 d 同余的.
(2) 存在某个整数 n ,使得 a = b + nd .
(3) d 整除 a - b .
- 定律
- 同余公式也有许多我们常见的定律,比如相等律,结合律,交换律,传递律….如下面的表示:
- a≡a(mod d)
- a≡b(mod d)→b≡a(mod d)
- (a≡b(mod d),b≡c(mod d))→a≡c(mod d)
- 如果a≡x(mod d),b≡m(mod d),则
- a+b≡x+m (mod d)
- a-b≡x-m(mod d)
- ab≡xm(mod d )
- 应用
(a+b)%c=(a%c+b%c)%c;
(a-b)%c=(a%c-b%c)%c;
(ab)%c=(a%cb%c)%c;
- 另一类考点就是对大数进行取模
对于大数的求余,联想到进制转换时的方法,得到
举例如下,设大数 m=1234, 模 n
就等于
((((1 * 10) % n + 2 % n) % n * 10 % n + 3 % n) % n * 10 % n + 4 % n)%n
//(大数取余)
#include <stdio.h>
char s[1000];
int main() {
int i, j, k, m, n;
while(~scanf("%s%d", s, &n)) {
m = 0;
for(i = 0; s[i] != '\0'; i++)
m = ((m * 10) % n + (s[i] - '0') % n) % n;
printf("%d\n", m);
}
return 0;
}
- 同余模定理的运算不适用于除法,对于除法取模的运算我们一般使用逆元来解决问题