🕐

同余与模运算

"%" 就是分糖果的零头;时钟就是 %12 的实体

💡 打个比方

17 颗糖分给小朋友,每人 3 颗,分给 5 个人后还剩 2 颗:17 % 3 = 2。"%" 就是"剩下的零头"。

时钟更妙:7 点再走 10 个小时,不是 17 点,而是 5 点——因为钟面只有 12 格,走满一圈又从头数:(7 + 10) % 12 = 5。

a ≡ b (mod m) 读作"a 与 b 模 m 同余",意思是:a 和 b 在 m 格时钟上站在同一格,也就是 a % m == b % m。

🖼️ 大图看明白

12 格时钟:%12 的游戏场 12 1 2 3 4 5 6 7 8 9 10 11 7 点 + 走 10 小时 (7 + 10) % 12 = 17 % 12 = 5 → 5 点! 同余:7 + 10 ≡ 5 (mod 12) 每个数字下面标它 %4 的余数 —— 同色 = 同余! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 4、8、12 都是蓝色(余 0):4 ≡ 8 ≡ 12 (mod 4) —— 它们是同余的! 余 0 余 1 余 2 余 3

📏 玩同余,只要 3 步

  1. 第 1 步:a % m = 把 a 按每份 m 分完后的零头,一定在 0 ~ m-1 之间。
  2. 第 2 步:a ≡ b (mod m) 就是 a % m == b % m——两个数在 m 格时钟上站同一格。
  3. 第 3 步:同余的数可以加、减、乘:a≡b 且 c≡d (mod m) → a+c≡b+d、a−c≡b−d、a×c≡b×d (mod m)。
为什么能加减乘?两个数在时钟上站同一格,同时往前拨同样的步数(或一起转圈),还是站同一格。所以同余式两边不能随便除,但加减乘放心用。

💻 C++ 怎么写

// 验证同余性质:a≡b 且 c≡d (mod m) → a+c ≡ b+d (mod m)
#include <iostream>
using namespace std;

int main() {
    int m = 12;
    // 7 ≡ 19 (mod 12),因为 7%12 == 19%12 == 7
    // 5 ≡ 17 (mod 12),因为 5%12 == 17%12 == 5
    int a = (7 + 5) % m;    // = 12 % 12 = 0
    int b = (19 + 17) % m;  // = 36 % 12 = 0
    cout << a << " " << b << "\n";  // 0 0 同一格 ✓

    // 时钟问题:h 点走 t 小时是几点(0~11 表示)
    int h, t;
    cin >> h >> t;
    cout << (h + t) % m << "\n";
    return 0;
}

✋ 你来试试

题目 1:2026 % 12 等于几?
12 × 168 = 2016,2026 − 2016 = 10。所以 2026 % 12 = 10,即 2026 ≡ 10 (mod 12)。
题目 2:如果 a ≡ b (mod m),那么 a + 5 和 b + 5 还同余吗?为什么?
还同余。(a+5) % m 和 (b+5) % m 相差的只是"先加了 5 再取余",结果仍然相等。时钟上就是:两人站在同一格,一起再走 5 格,还是站在同一格。所以 (a+5) ≡ (b+5) (mod m)。
🎯 一句话记住:% 是零头(0~m-1);a ≡ b (mod m) = 在 m 格时钟上站同一格;同余可以加减乘,不能乱除。