Справочник математических формул и трюков, критически важных для алгоритмических собеседований
🔢 АРИФМЕТИКА И ПОСЛЕДОВАТЕЛЬНОСТИ
Суммы прогрессий
-
Арифметическая прогрессия 1..n
sum = n * (n + 1) // 2
Пример: Сумма чисел от 1 до 100 = 100×101/2 = 5050 -
Сумма квадратов
1² + 2² + ... + n² = n * (n + 1) * (2n + 1) // 6
Пример: Для n=3: 1+4+9=14 = 3×4×7/6=14 -
Сумма кубов
1³ + 2³ + ... + n³ = (n * (n + 1) // 2)²
Пример: Для n=3: 1+8+27=36 = (3×4/2)²=6²=36 -
Сумма арифметической прогрессии
a + (a+d) + ... + (a+(n-1)d) = n*(2a + (n-1)*d) // 2
Пример: 3+5+7+9 (n=4, a=3, d=2) = 4×(2×3 + 3×2)/2 = 24 -
Геометрическая прогрессия
a + a*r + a*r² + ... + a*r^(n-1) = a*(rⁿ - 1)/(r - 1) для r≠1
Формулы комбинаторики
-
Количество пар (рукопожатия)
Из n элементов: n * (n - 1) // 2
Пример: 10 людей = 10×9/2=45 handshakes -
Количество подмассивов/подотрезков
В массиве длины n: n * (n + 1) // 2
Пример: [a,b,c] → 6 подмассивов: [a],[b],[c],[a,b],[b,c],[a,b,c] -
Количество подпоследовательностей
2ⁿ - 1 (непустые), 2ⁿ (с пустой)
Пример: [a,b] → 3: [a],[b],[a,b] -
Треугольное число
T_n = n*(n+1)//2 (то же, что сумма 1..n)
🔢 ДЕЛИМОСТЬ И ОСТАТКИ
-
Проверка чётности
if n & 1: # нечётное (бит младшего разряда = 1) if n % 2 == 0: # чётное
-
Остаток от деления (особые случаи)
- (a + b) % m = (a%m + b%m) % m
- (a * b) % m = (a%m * b%m) % m
- a % b = a - (a // b) * b (определение)
-
Проверка делимости на 3
Сумма цифр делится на 3 → число делится на 3
Пример: 123 → 1+2+3=6 делится на 3 → 123 делится -
Проверка делимости на 4
Последние 2 цифры образуют число, делящееся на 4
Пример: 1236 → 36 делится на 4 → 1236 делится -
Проверка делимости на 9
Сумма цифр делится на 9 -
Наибольший общий делитель (НОД)
import math math.gcd(a, b) # Или алгоритм Евклида: def gcd(a, b): while b: a, b = b, a % b return aСвойство: gcd(a, b) * lcm(a, b) = a * b
-
Наименьшее общее кратное (НОК)
lcm(a, b) = a * b // gcd(a, b)
🔢 БИТОВЫЕ ОПЕРАЦИИ
Базовые операции
-
Проверка i-го бита
bit = (n >> i) & 1 # i-й бит (считая с 0 справа) if n & (1 << i): # альтернатива
-
Установка i-го бита в 1
n = n | (1 << i) -
Установка i-го бита в 0
n = n & ~(1 << i) -
Переключение i-го бита
n = n ^ (1 << i) -
Извлечение младшего бита (LSB)
lsb = n & -n # полезно для Fenwick tree -
Удаление младшего бита
n = n & (n - 1) # используется в подсчёте единиц
Полезные трюки
-
Число является степенью двойки
(n & (n - 1)) == 0 and n > 0
Пример: 8 (1000) & 7 (0111) = 0 -
Округление до следующей степени двойки
def next_power_of_two(n): n -= 1 n |= n >> 1 n |= n >> 2 n |= n >> 4 n |= n >> 8 n |= n >> 16 return n + 1 -
Подсчёт единичных битов (popcount)
bin(n).count('1') # Или быстрее: def popcount(n): count = 0 while n: n &= n - 1 count += 1 return count -
Маска всех битов до k
mask = (1 << k) - 1 # k младших битов в 1
Пример: k=3 → mask=7 (111 в бинарном) -
Извлечение нескольких битов
bits = (n >> start) & ((1 << length) - 1) -
Обмен значений без временной переменной
a ^= b b ^= a a ^= b # Только для целых чисел!
🔢 МАТРИЦЫ И ГЕОМЕТРИЯ
Поворот матрицы
-
Поворот на 90° по часовой
# Для квадратной матрицы n×n def rotate_clockwise(matrix): n = len(matrix) # Транспонирование for i in range(n): for j in range(i+1, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] # Отражение по вертикали for i in range(n): matrix[i].reverse() return matrixФормула для элемента: new[i][j] = old[n-1-j][i]
-
Поворот на 90° против часовой
Транспонирование + отражение по горизонтали
Формула: new[i][j] = old[j][n-1-i]
Работа с координатами
-
Манхэттенское расстояние
dist = |x1 - x2| + |y1 - y2| -
Евклидово расстояние
dist = sqrt((x1-x2)² + (y1-y2)²) -
Проверка на одной линии
Точки (x1,y1), (x2,y2), (x3,y3) коллинеарны если:
(y2-y1)*(x3-x1) == (y3-y1)*(x2-x1) -
Площадь треугольника по координатам
area = 0.5 * abs(x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2)) -
Векторное произведение (cross product)
cross = x1*y2 - x2*y1
Положительно → поворот против часовой,
Отрицательно → по часовой,
0 → коллинеарны
🔢 МНОЖЕСТВА И КОМБИНАТОРИКА
Операции с множествами (теория)
-
Мощность объединения
|A ∪ B| = |A| + |B| - |A ∩ B| -
Мощность объединения трёх
|A ∪ B ∪ C| = |A|+|B|+|C| - |A∩B|-|A∩C|-|B∩C| + |A∩B∩C| -
Принцип включения-исключения (общий)
Для множеств A₁...Aₙ:
|⋃A_i| = Σ|A_i| - Σ|A_i∩A_j| + Σ|A_i∩A_j∩A_k| - ...
Биномиальные коэффициенты
-
Сочетания (C(n,k))
C(n,k) = n! / (k! * (n-k)!)
Треугольник Паскаля: C(n,k) = C(n-1,k-1) + C(n-1,k) -
Количество перестановок
- Всех элементов: n!
- С повторениями: n! / (n₁! * n₂! * ...)
где n₁, n₂... — количества одинаковых элементов
🔢 ПРЕОБРАЗОВАНИЯ СИСТЕМ СЧИСЛЕНИЯ
-
Из двоичной в десятичную
int('1011', 2) # = 11 # Или вручную: 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1=11 -
Из десятичной в двоичную
bin(n)[2:] # строка # Или: format(n, 'b')
-
Из десятичной в любую систему (2-36)
def to_base(n, base): digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" if n == 0: return "0" result = "" while n > 0: result = digits[n % base] + result n //= base return result -
Шестнадцатеричная система
hex(n)[2:] # строка int('FF', 16) # = 255
🔢 ФОРМУЛЫ ДЛЯ ОПТИМИЗАЦИИ
-
Сумма арифметической прогрессии через среднее
sum = среднее × количество
Среднее = (первый + последний) / 2 -
Быстрое возведение в степень
def pow_mod(a, b, mod=None): result = 1 while b > 0: if b & 1: result = result * a if mod: result %= mod a = a * a if mod: a %= mod b >>= 1 return result -
Обратный элемент по модулю (для простого p)
a^(-1) ≡ a^(p-2) (mod p) (малая теорема Ферма)
Только если p — простое и a не делится на p -
Формула для суммы цифр
def sum_digits(n): s = 0 while n: s += n % 10 n //= 10 return s -
Проверка на простое число
def is_prime(n): if n < 2: return False if n % 2 == 0: return n == 2 if n % 3 == 0: return n == 3 i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6 return True
🔢 ПОЛЕЗНЫЕ МАТЕМАТИЧЕСКИЕ СВОЙСТВА
-
Среднее арифметическое ≥ среднее геометрическое
(a+b)/2 ≥ √(ab) для неотрицательных a,b -
Числа Фибоначчи
- Формула Бине: F_n ≈ φⁿ/√5, где φ=(1+√5)/2
- Свойство: F_{n+m} = F_{n-1}F_m + F_n F_{m+1}
- Быстрое вычисление через матрицы
-
Факториал
n! = 1×2×...×n
Приближение Стирлинга: n! ≈ √(2πn)(n/e)ⁿ -
Логарифмические тождества
- log(a×b) = log(a) + log(b)
- log(aᵇ) = b×log(a)
- logₐb = log_c b / log_c a (смена основания)
🎯 КАК ИСПОЛЬЗОВАТЬ НА СОБЕСЕДОВАНИИ
-
Распознавайте паттерны:
- "Сумма всех подмассивов" → n*(n+1)//2
- "Количество пар" → n*(n-1)//2
- "Поворот изображения" → формулы транспонирования
-
Оптимизируйте с помощью битов:
- Задача с 26 буквами → битовая маска (int32 хватит)
- Проверка уникальности → быстро через биты
-
Используйте математические свойства:
- Делимость на 3/9 → сумма цифр
- Степень двойки → n & (n-1) == 0
-
Работа с координатами:
- Манхэттенское расстояние → |dx|+|dy|
- Коллинеарность точек → векторное произведение
Запомните: Главное — не выучить все формулы наизусть, а понимать, когда какую применять. На собеседовании можно вывести многие формулы, но знание ключевых ускоряет решение в разы.