백준(BOJ) - 나머지 합(10986번) - 파이썬(python)

2023. 2. 11. 17:04코딩테스트/백준(BOJ)

문제

수 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 sys
input=sys.stdin.readline

n,m= map(int,input().split())

arr=list(map(int,input().split()))

rem=[0 for _ in range(m)]
tmp=0
cnt=0

for x in range(n):
    tmp+=arr[x]
    # 나머지가 같은 것들끼리 (index) 개수를 카운트한 배열
    rem[tmp%m]+=1

# 두 구간 중 나머지가 0인 부분은 그 자신만으로 나머지가0
cnt=rem[0]
for i in rem:
    # 나머지가 같은 두 구간을 뽑는 조합
    # i C 2 = i*(i-1)//2
    cnt+=i*(i-1)//2

print(cnt)

728x90