Chapter 22

Home

Modular Arithmetic Basics

Many CP problems ask for the answer modulo M (usually M = 10โน+7). Modular arithmetic lets you work with huge numbers by keeping intermediate values small.

The Modulo Operator

a % m gives the remainder when a is divided by m. The key rules:

(a + b) % M = ((a % M) + (b % M)) % M
(a * b) % M = ((a % M) * (b % M)) % M
(a - b) % M = ((a % M) - (b % M) + M) % M  // add M to avoid negative

C++

const long long MOD = 1e9 + 7;

long long add_mod(long long a, long long b) {
    return (a % MOD + b % MOD) % MOD;
}

long long mul_mod(long long a, long long b) {
    return (a % MOD) * (b % MOD) % MOD;
}

long long sub_mod(long long a, long long b) {
    return ((a % MOD) - (b % MOD) + MOD) % MOD;
}

Rust

const MOD: u64 = 1_000_000_007;

fn add_mod(a: u64, b: u64) -> u64 {
    (a % MOD + b % MOD) % MOD
}

fn mul_mod(a: u64, b: u64) -> u64 {
    (a % MOD) * (b % MOD) % MOD
}

fn sub_mod(a: u64, b: u64) -> u64 {
    (a % MOD + MOD - b % MOD) % MOD
}

๐Ÿ’ก Why 10โน+7?

It's a large prime (fits in 32-bit int), and it's common in CP problems. Using a prime modulus allows modular inverses (later).

Problem: Large Sum

Given N and N integers, print the sum modulo 10โน+7. The values can be up to 10ยนยฒ, so a 64-bit sum works but the problem wants the result modulo M.

C++

const long long MOD = 1e9 + 7;

int main() {
    int n; cin >> n;
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        long long x; cin >> x;
        sum = (sum + x % MOD) % MOD;
    }
    cout << sum << "\n";
    return 0;
}

Rust

const MOD: u64 = 1_000_000_007;

fn main() {
    // ... read nums ...
    let sum = nums.iter().fold(0, |acc, &x| (acc + x % MOD) % MOD);
    println!("{}", sum);
}

Key Takeaways

Practice