https://www.acmicpc.net/problem/10986

((A%M)+(B%M)) % M = (A+B) % M
((sum(j)%M) - (sum(i)%M)) % M = (sum(j) - sum(i)) % M
((sum(j)%M) - (sum(i)%M)) % M = 0
즉, ((sum(i)%M) = (sum(j)%M))
0 ~ i, j까지의 누적합 나머지가 같다면 i~j 는 0으로 나누어 짐

#include <iostream>
using namespace std;
int main(){
// C++ 입출력 최적화
ios::sync_with_stdio(false);
// cin 실행 후 cout 자동 flush 방지
cin.tie(NULL);
int n,m;
cin >> n >> m;
// 나머지 배열 초기화
long long arr[m] = {0};
for (int i=0; i<m; i++) {
arr[i]=0;
}
long long sum = 0;
for (int i=0; i<n; i++) {
int x;
cin >> x;
sum += x;
arr[sum%m]++;
}
// 나머지가 0인 경우는 독립적으로도 count 가능
long long cnt = arr[0];
for (int i=0; i<m; i++) {
if(arr[i]!=0) cnt += (arr[i] * (arr[i] - 1)) / 2;
}
cout << cnt;
return 0;
}
조합 공식도 다시 찾아보고, 모듈러 성질도 다시 복습하면서 푼 문제.
세상엔 정말 똑똑한 사람이 많다…