---
# System prepended metadata

title: Popcount Sum - Solución
tags: [Soluciones]

---

# Popcount Sum - Solución
Hallar e imprimir el valor de la siguiente suma:

$$
\sum_{
    1 \leq i \leq N \\ 
    i \% M = R
}popcount(i)
$$

donde $popcount(x)$ es igual a la cantidad de bits en $x$ con valor $1$.

## Solución
Primero notemos que si $i$ cumple que $i \% M = R$ se puede expresar como $i=k \cdot M+R$, para un entero $k$, por el algoritmo de la división. Modifiquemos la expresión de la suma para iterar sobre $k$:

$$
\sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor}popcount(k \cdot M + R)
$$

El límite superior de la suma es $\lfloor \frac{N-R}{M} \rfloor$, ya que se debe cumplir que $k \cdot M + R \leq N$. Al despejar $k$ obtenemos $k \leq \lfloor \frac{N-R}{M} \rfloor$.

Ahora, expresemos $popcount(x)$ mediante una expresión matemática para una $x$ de tipo `int`:

$$
popcount(x)=\sum_{b=0}^{31}isSet(x,b)
$$

donde:

$$
\begin{equation}
isSet(x,b)=
    \begin{cases}
        1 & \text{si el b-ésimo bit está prendido en x}\\
        0 & \text{en caso contrario}
    \end{cases}
\end{equation}
$$

Existen varias formas de expresar $isSet(x,b)$ mediante una expresión, aquí hay tres ejemplos:

$isSet(x,b)=(x >> b) \& 1$

$isSet(x,b)=\lfloor \frac{x}{2^b} \rfloor \% 2$

$isSet(x,b)=\lfloor \frac{x}{2^b} \rfloor  -2 \cdot \lfloor \frac{x}{2^{b+1}} \rfloor$

Utilicemos la última y sustituyamosla en nuestro problema original:

$$
\sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor}popcount(k \cdot M + R) = \sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor} \sum_{b=0}^{31}isSet(k \cdot M + R,b)
$$
$$
=\sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor} \sum_{b=0}^{31}(\lfloor \frac{k \cdot M + R}{2^b} \rfloor  -2 \cdot \lfloor \frac{k \cdot M + R}{2^{b+1}} \rfloor)
$$
$$
=\sum_{b=0}^{31} \sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor} (\lfloor \frac{k \cdot M + R}{2^b} \rfloor  -2 \cdot \lfloor \frac{k \cdot M + R}{2^{b+1}} \rfloor)
$$
$$
=\sum_{b=0}^{31}( \sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor} \lfloor \frac{k \cdot M + R}{2^b} \rfloor - \sum_{k=0}^{\lfloor \frac{N-R}{M} \rfloor} 2 \cdot \lfloor \frac{k \cdot M + R}{2^{b+1}} \rfloor)
$$

Una suma de la forma $\sum_{i=0}^n \lfloor \frac{a \cdot i+b}{m} \rfloor$ es conocida como **Floor Sum** o Suma de Pisos y ya existe un método para hallar esta suma en $O(logn)$, por ejemplo, en el [reference de Alan](https://github.com/alaneos777/reference/blob/master/numberTheory.cpp#L1003).

Finalmente, la respuesta es la siguiente:

$$
\sum_{b=0}^{31}( f(M,R,2^b,\lfloor \frac{N-R}{M} \rfloor) - 2 \cdot f(M,R,2^{b+1},\lfloor \frac{N-R}{M} \rfloor) )
$$

donde $f(a,b,m,n)$ es la función de Floor Sum.

Complejidad: $O(log^2n)$