¿Existe un algoritmo para contar el número de subsecuencias divisibles por 8?

para un caso genérico una subsecuencia divisible por k:

cin >> n >> k; // n es el número, k el divisor
suma [0] = 0;
memset (cnt, 0, sizeof cnt);
cnt [0] = 1;
para (int i = 1; i <= n; i ++)
{
cin >> x;
suma [i] = (suma [i-1] + x)% k;
cnt [sum [i]] ++;
}

largo largo res = 0;
para (int r = 0; r <k; r ++)
res + = (cnt [r] * (cnt [r] -1) / 2);
cout << res << endl;

Mantener suma acumulativa, suma [0 … i]

para obtener la suma [i..j] use sum [0..j] – sum [0… i-1]

Si (sum [j] -sum [i])% k == 0, entonces (a [i + 1] + a [i + 2] +… + a [j])% k es igual a cero, entonces Necesito incluirlo.

Pero esto también significa que sum [i] y sum [j] tienen el mismo resto k,

Reescribe sum [] (donde sum es la suma de cada elemento consecutivo a medida que uno se mueve de izquierda a derecha en la matriz) con cada elemento mod k , verá que elegir cualquiera de los dos ceros (en la matriz de suma mod k) conduce a una correcta subsecuencia

Diríjase al siguiente enlace [1] en el desbordamiento de la pila. Se proporciona una explicación detallada de la solución O (n * 8).

Notas al pie

[1] Número de subsecuencias de una matriz dada que son divisibles por n