Chapter 22
HomeMany 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.
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
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;
}
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).
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.
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;
}
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);
}
% M after every addition and multiplication.
long long / u64 โ multiplication of two mod values < M still fits in 64 bits.