Basic Math
Master fundamental mathematical concepts essential for algorithmic problem solving.
Prime Numbers
Prime Number Properties
- Definition: Natural number greater than 1 with no positive divisors other than 1 and itself
- First few primes: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47...
Prime Checking
// Check if a number is prime
bool isPrime(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
Sieve of Eratosthenes
// Generate all primes up to n
vector<bool> sieve(int n) {
vector<bool> isPrime(n + 1, 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 isPrime;
}
Prime Factorization
// Get prime factors of a number
vector<pair<int, int>> primeFactors(int n) {
vector<pair<int, int>> factors;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
int count = 0;
while (n % i == 0) {
n /= i;
count++;
}
factors.push_back({i, count});
}
}
if (n > 1) {
factors.push_back({n, 1});
}
return factors;
}
GCD & LCM
Greatest Common Divisor (GCD)
// Euclidean algorithm
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
// Recursive version
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
Least Common Multiple (LCM)
// LCM using GCD
int lcm(int a, int b) {
return (a / gcd(a, b)) * b;
}
Extended Euclidean Algorithm
// Find x, y such that ax + by = gcd(a, b)
int extendedGcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int x1, y1;
int g = extendedGcd(b, a % b, x1, y1);
x = y1;
y = x1 - (a / b) * y1;
return g;
}
Modular Arithmetic
Modular Addition
// (a + b) mod m
int modAdd(int a, int b, int m) {
return ((a % m) + (b % m)) % m;
}
Modular Multiplication
// (a * b) mod m
int modMul(int a, int b, int m) {
return ((a % m) * (b % m)) % m;
}
Modular Exponentiation
// (a^b) mod m
int modPow(int base, int exp, int mod) {
int result = 1;
base %= mod;
while (exp > 0) {
if (exp & 1) {
result = (result * base) % mod;
}
base = (base * base) % mod;
exp >>= 1;
}
return result;
}
Modular Inverse
// Find x such that (a * x) ≡ 1 (mod m)
int modInverse(int a, int m) {
int x, y;
int g = extendedGcd(a, m, x, y);
if (g != 1) {
return -1; // No inverse exists
}
return (x % m + m) % m;
}
Factorial & Permutations
Factorial
// Calculate n!
long long factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// Factorial with modulo
int factorialMod(int n, int mod) {
long long result = 1;
for (int i = 2; i <= n; i++) {
result = (result * i) % mod;
}
return result;
}
Permutations
// Calculate P(n, r) = n! / (n-r)!
long long permutation(int n, int r) {
if (r > n) return 0;
long long result = 1;
for (int i = 0; i < r; i++) {
result *= (n - i);
}
return result;
}
Combinations
// Calculate C(n, r) = n! / (r! * (n-r)!)
long long combination(int n, int r) {
if (r > n) return 0;
if (r > n - r) r = n - r; // Optimization
long long result = 1;
for (int i = 0; i < r; i++) {
result = result * (n - i) / (i + 1);
}
return result;
}
Combinatorics
Pascal's Triangle
// Generate Pascal's triangle
vector<vector<int>> pascalTriangle(int n) {
vector<vector<int>> triangle(n);
for (int i = 0; i < n; i++) {
triangle[i].resize(i + 1);
triangle[i][0] = triangle[i][i] = 1;
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
return triangle;
}
Catalan Numbers
// Calculate nth Catalan number
long long catalan(int n) {
if (n <= 1) return 1;
long long result = 0;
for (int i = 0; i < n; i++) {
result += catalan(i) * catalan(n - 1 - i);
}
return result;
}
// Dynamic programming approach
long long catalanDP(int n) {
vector<long long> dp(n + 1, 0);
dp[0] = dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 0; j < i; j++) {
dp[i] += dp[j] * dp[i - 1 - j];
}
}
return dp[n];
}
Fibonacci Numbers
// Calculate nth Fibonacci number
long long fibonacci(int n) {
if (n <= 1) return n;
long long a = 0, b = 1;
for (int i = 2; i <= n; i++) {
long long temp = a + b;
a = b;
b = temp;
}
return b;
}
Number Theory Concepts
Divisors
// Get all divisors of a number
vector<int> getDivisors(int n) {
vector<int> divisors;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
divisors.push_back(i);
if (i != n / i) {
divisors.push_back(n / i);
}
}
}
sort(divisors.begin(), divisors.end());
return divisors;
}
Totient Function (Euler's Phi)
// Calculate φ(n) - count of numbers coprime to n
int eulerPhi(int n) {
int result = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
while (n % i == 0) {
n /= i;
}
result -= result / i;
}
}
if (n > 1) {
result -= result / n;
}
return result;
}
Common Patterns
- Prime factorization for divisor problems
- GCD/LCM for fraction and multiple problems
- Modular arithmetic for large number calculations
- Combinatorics for counting problems
- Number theory for mathematical properties
Performance Tips
- Use sieve for multiple prime checks
- Precompute factorials for combination problems
- Use modular arithmetic to prevent overflow
- Optimize GCD with binary GCD algorithm
- Cache results for expensive calculations