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;
- Staad Pro: ¿Cómo puedo resolver este problema?
- ¿Cuál es la aplicación en tiempo real de árboles y gráficos en estructuras de datos?
- Ahora he leído sobre algoritmos y estructuras de datos como Al Klein me dijo. ¿Qué lenguaje de programación debo aprender?
- Cómo obtener el valor más cercano al número al agregar elementos de matriz
- Además de la velocidad, ¿qué otras medidas de eficiencia se podrían usar en un entorno real?
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