Subarray Divisibility
Problema
Nos piden hallar el número de subarreglos que son divisibles por . En otras palabras, debemos hallar el número de subarreglos con suma igual a .
Explicación
Nótese que cualquier suma de un subarreglo se puede representar como la diferencia de dos prefijos.
Primero, sea la suma de prefijos del arreglo módulo .
Con nuestro conocimiento de sumas de prefijos,
Como queremos calcular el número de que es igual a , debe ser igual a para que su diferencia sea .
Ahora calculamos , el número de prefijos con resto equivalente a . Entonces el número de pares que aporta es
La respuesta es simplemente la suma de esta cantidad sobre todo .
Implementación
Complejidad temporal:
#include <iostream>
#include <vector>
using namespace std;
/**
* @author Qi Wang
* (detemplifying courtesy of Kevin Sheng)
*/
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
vector<long long> M(N);
long long psums = 0;
M[psums] = 1;
for (int i = 0; i < N; i++) {
int a;
cin >> a;
psums += a;
// Remember to account for negative sums
M[(psums % N + N) % N]++;
}
long long ans = 0;
for (long long x : M) {
/*
* Calculating the # of pairs.
* This calculates the pairs without
* duplicates and reverse groups.
*/
ans += x * (x - 1) / 2;
}
cout << ans << endl;
}import java.io.*;
import java.util.*;
public class subarrayDivisibility {
public static void main(String[] args) {
Kattio io = new Kattio();
int n = io.nextInt();
long[] M = new long[n];
long prefixSums = 0;
M[0] = 1;
for (int i = 0; i < n; i++) {
int a = io.nextInt();
prefixSums += a;
// remember to account for negative sums
M[((int)(prefixSums % n) + n) % n]++;
}
long answer = 0;
for (long x : M) {
/*
* calculating the # of pairs, this calculates the pairs without
* duplicates and reverse groups
*/
answer += x * (x - 1) / 2;
}
io.println(answer);
io.close();
}
// CodeSnip{Kattio}
}n = int(input())
arr = map(int, input().split())
residue_counts = [0] * n
partial_sum = 0
residue_counts[partial_sum] = 1
for a in arr:
partial_sum += a
partial_sum = partial_sum % n
residue_counts[partial_sum] += 1
# each subarray with sum divisible by n corresponds to
# a pair of indices that have the same residue
print(sum(r * (r - 1) // 2 for r in residue_counts))