Saturday, 7 Mar 2026

Essential Math Concepts for DSA Problem Solving Explained

Understanding Prime Numbers

Prime numbers are fundamental in number theory and DSA problems. A prime number is a natural number greater than 1 with no positive divisors other than 1 and itself. The naive approach checks divisibility from 2 to √n:

bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

Why this works: Checking up to √n suffices because if n has a divisor greater than √n, its corresponding divisor must be less than √n. Time complexity: O(√n).

Sieve of Eratosthenes for Prime Ranges

When counting primes in a range (e.g., LeetCode Problem 204), the Sieve of Eratosthenes is optimal:

int countPrimes(int n) {
    if (n <= 2) return 0;
    vector<bool> isPrime(n, true);
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i * i < n; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j < n; j += i) {
                isPrime[j] = false;
            }
        }
    }
    return count(isPrime.begin(), isPrime.end(), true);
}

Key optimizations:

  • Start marking multiples from i*i (smaller multiples already handled)
  • Terminate outer loop at √n
  • Time complexity: O(n log log n) - nearly linear

Digit Manipulation Techniques

Extracting Digits

while (n > 0) {
    int digit = n % 10;
    n /= 10;
    // Process digit
}

Counting Digits Shortcut

int digitCount = floor(log10(n)) + 1;

Armstrong Number Check

bool isArmstrong(int n) {
    int original = n, sum = 0, digits = log10(n) + 1;
    while (n) {
        int digit = n % 10;
        sum += pow(digit, digits);
        n /= 10;
    }
    return sum == original;
}

GCD and LCM Mastery

Euclidean Algorithm

int gcd(int a, int b) {
    while (a && b) {
        if (a > b) a %= b;
        else b %= a;
    }
    return a | b;  // Non-zero value
}

Recursive approach:

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

LCM Calculation

int lcm(int a, int b) {
    return (a / gcd(a, b)) * b;  // Avoid overflow
}

Number Reversal and Palindromes

Safe Reversal (Handles Overflow)

int reverse(int x) {
    int rev = 0;
    while (x) {
        if (rev > INT_MAX/10 || rev < INT_MIN/10) return 0;
        rev = rev * 10 + x % 10;
        x /= 10;
    }
    return rev;
}

Palindrome Check

bool isPalindrome(int n) {
    if (n < 0) return false;
    return n == reverse(n);
}

Crucial Modulo Arithmetic Properties

  1. Addition: (a + b) % m = ((a % m) + (b % m)) % m
  2. Subtraction: (a - b) % m = ((a % m) - (b % m) + m) % m
  3. Multiplication: (a * b) % m = ((a % m) * (b % m)) % m
  4. Exponentiation: Use modular exponentiation for large powers

Why 10⁹+7 is used: This large prime minimizes collision chances in hashing while fitting within 32-bit integer limits.

Practical Implementation Tips

  1. Prime optimization: Precompute primes using Sieve for range queries
  2. GCD/LCM: Use Euclidean algorithm for efficiency (O(log min(a,b)))
  3. Digit handling: Convert numbers to strings only when necessary
  4. Modulo operations: Apply properties early to prevent overflow

Pro Tip: When solving problems involving large numbers, always:

  • Check constraints immediately
  • Identify potential overflow points
  • Use long or long long where necessary
  • Apply modulo properties during intermediate steps

Actionable Cheat Sheet

  1. Prime check: Loop to √n
  2. Prime range: Sieve of Eratosthenes
  3. Digit extraction: digit = n % 10, n /= 10
  4. GCD: Euclidean algorithm (iterative/recursive)
  5. Number reversal: Multiply by 10 + last digit
  6. Modulo: Apply distributive properties before operations

Recommended Resources

  1. Books:
    • Elements of Programming Interviews (Azetli) - Practical implementations
    • Introduction to Algorithms (CLRS) - Mathematical foundations
  2. Online:
    • LeetCode's Math section (filter easy-to-hard)
    • GeeksforGeeks "Mathematical Algorithms" section
  3. Tools:
    • Visual Studio Code with C++ TestMate
    • Online Big Integer Calculator (test large outputs)

Conclusion

Mastering these mathematical concepts transforms how you approach DSA problems. The Sieve of Eratosthenes optimizes prime checks, Euclidean algorithm simplifies GCD/LCM, and proper modulo handling prevents overflow errors. Which concept do you anticipate using most frequently? Share your target problem types in the comments!

PopWave
Youtube
blog