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

n의 범위만 더 작았더라면 이것도 백퍼 맞았을 것 같다.
n, m = map(int, input().split())
num = list(map(int, input().split()))
prefix_sum = [0]*(n+1)
sum = 0
for i in range(1, n+1):
sum += num[i-1]
prefix_sum[i] = sum
cnt = 0
for i in range(1, n+1):
for j in range(i):
if (prefix_sum[i] - prefix_sum[j]) % m == 0:
cnt += 1
print(cnt)
모든 구간들의 누적합을 구해서 나눠도 되지만(위 코드처럼) n의 범위가 1000000으로 매우 커서 시간 초과가 난다.
n, m = map(int, input().split())
num = list(map(int, input().split()))
remainder = [0]*m
sum = 0
for i in range(n):
sum += num[i]
remainder[sum%m] += 1
answer = remainder[0] # 이미 나머지가 0이면 무조건 나누어 떨어짐
# 나머지가 1인 구간 두 곳 뽑아서 빼면 나누어 떨어짐
# (나머지가 1인 구간) - (나머지가 1인 구간) = (나머지 0)
for i in remainder:
answer += i*(i-1) // 2
print(answer)