링크
https://www.acmicpc.net/problem/10986
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 10^6, 2 ≤ M ≤ 10^3)
둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다. (0 ≤ Ai ≤ 10^9)
첫째 줄에 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 출력한다.
5 3
1 2 3 1 2
7
typedef long long ll;
int N, M;
ll result;
ll tmp;
ll* arr;
for (int i = 1; i <= N; i++) {
scanf("%lld", &arr[i]);
arr[i] += arr[i - 1];
arr[i] %= M;
cnt[arr[i]]++;
}
result = cnt[0];
for (int i = 0; i < M; i++) {
tmp = cnt[i];
result += tmp * (tmp - 1) / 2;
}
printf("%lld", result);
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
ll cnt[1001];
int main()
{
int N, M;
ll result;
ll tmp;
ll* arr;
scanf("%d %d", &N, &M);
arr = (ll*)calloc(N+1, sizeof(ll));
for (int i = 1; i <= N; i++) {
scanf("%lld", &arr[i]);
arr[i] += arr[i - 1];
arr[i] %= M;
cnt[arr[i]]++;
}
result = cnt[0];
for (int i = 0; i < M; i++) {
tmp = cnt[i];
result += tmp * (tmp - 1) / 2;
}
printf("%lld", result);
free(arr);
return 0;
}
좋은 글이네요. 공유해주셔서 감사합니다.