# 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)$