문제
수 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으로 나누어 떨어지는 구간의 개수를 출력한다.
- 예제 입력 1
5 3 1 2 3 1 2
- 예제 출력 1
7
- 정답
import sys input = sys.stdin.readline n, m = map(int, input().split()) # n : 숫자 갯수, m : 나눌 수 num = list(map(int, input().split())) + [0] # 숫자 입력 r = [0] * m # 누적합을 m으로 나눴을 때의 나머지가 index이고 그 값에 count for i in range(n): num[i] += num[i - 1] # 숫자 정보를 누적합으로 갱신 r[num[i] % m] += 1 # 해당 누적합을 m으로 나눴을 때의 나머지에 해당하는 값에 1추가 cnt = r[0] # 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수 for i in r: cnt += i * (i - 1) // 2 print(cnt)