
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103)
둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다. (0 ≤ Ai ≤ 109)
첫째 줄에 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 출력한다.
정보
목표
수학적 분석
누적합 + 나머지 활용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ10986 {
static int N, M;
static long[] count;
private static void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
count = new long[M];
long sum = 0;
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < N ; i++){
sum += Integer.parseInt(st.nextToken());
int mod = (int) (sum % M);
if(mod < 0) mod += M;
count[mod]++;
}
long result = count[0];
for (int i = 0; i < M; i++) {
if (count[i] > 1) {
result += (count[i] * (count[i] - 1)) / 2;
}
}
System.out.println(result);
}
public static void main(String[] args) throws IOException {
BOJ10986.solution();
}
}
