Cuentas / C++17

Cuentas enteras y restos

Llevar al apunte ↗

Descripción

Las operaciones entre enteros producen resultados enteros. En una división, la parte fraccionaria se descarta hacia cero. % calcula el resto. Estas operaciones sirven para repartir en grupos completos, consultar divisibilidad y separar una cantidad en unidades más grandes.

Para redondear una división positiva hacia arriba, podés usar el cociente y sumar uno si queda resto. Para conservar un resultado entre 0 y m - 1, calculá el resto y sumá m cuando sea negativo.

El tamaño de cada operación intermedia importa. Si un producto puede superar int, ampliá uno de sus operandos antes de multiplicar. Aplicar % después del producto no corrige un desbordamiento que ya ocurrió.

Funciones y operaciones

Uso Condición Resultado
a / b b distinto de cero y cociente representable Cociente entero hacia cero
a % b División válida Resto, con el signo de a cuando no es cero
a / b + (a % b != 0) a >= 0 y b > 0 Techo de la división
abs(x) El valor positivo cabe en el tipo Valor absoluto
1LL * a * b Producto representable en long long Producto en un tipo amplio
(a + b) % m m > 0 y suma representable Resto de la suma

Ejemplos

Cociente, resto y techo

long long a = 11, b = 4;
long long cociente = a / b; // 2
long long resto = a % b; // 3
long long techo = a / b + (a % b != 0); // 3

Esta fórmula evita sumar a + b - 1, que también podría exceder el tipo.

Normalizar un resto negativo

long long x = -3, m = 5;
long long r = x % m;
if (r < 0) r += m;
// r vale 2

Calcular un producto modular

long long mod = 1000000007LL;
long long a = mod - 1, b = mod - 2;
long long producto = (a * b) % mod; // 2

Aquí los operandos reducidos tienen un producto que cabe en 64 bits. Con un módulo mayor hay que volver a comprobar esa cota.

Contar pares de elementos distintos

Para elegir dos posiciones diferentes entre n, sin importar su orden, la cantidad es n * (n - 1) / 2. La receta divide primero uno de los factores para reducir el tamaño del producto intermedio.

long long n = 100000;
long long a = n, b = n - 1;
if (a % 2 == 0) a /= 2;
else b /= 2;
long long pares = a * b; // 4999950000

El cálculo usa n >= 1. Dividí el factor par antes de multiplicar y comprobá que el producto final quepa. Si el resultado lleva módulo, reducí los factores después de esa división entera.