import sys
def input():
return sys.stdin.readline().rstrip()
T = int(input())
for _ in range(T):
d,n = map(int,input().split())
mod = [ 0 for _ in range(d)]
arr = list(map(int,input().split()))
prefix_sum = [0] + arr[:]
mod[0] += 1
for i in range(n):
prefix_sum[i+1] += prefix_sum[i]
prefix_sum[i+1] %= d
mod[prefix_sum[i+1]] += 1
result = 0
for i in range(d):
result += (mod[i] * (mod[i]-1))//2
print(result)
이 문제는 누적합을 활용한 문제이다.
먼저 누적합을 구하면서 해당 누적합을 d로 나눈 나머지를 mod에 개수로 세어준다.
그러면 우리는 좌측부터 누적했을 때의 d로 나눴을 때 나오는 나머지의 값들이 언제 나오는지 알 수 있다.
그러면 우리는 d로 나눠지는 모든 경우의 수는
같은 나머지를 가지는 구간에서 2개를 뽑아서 그 두 구간을 빼주면 나머지가 0이 됨을 알 수 있다.
그러므로, 우리는 0부터 d-1까지 nC2를 해주면 된다.
그리고 우리는 0부터 하기 위해서, 0일때에 기본값으로 다른 나머지와 달리 1을 넣어주었다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 5430 AC (0) | 2021.09.02 |
---|---|
[BOJ/백준] 4095 최대 정사각형 (0) | 2021.09.02 |
[BOJ/백준] 2023 신기한 소수 (0) | 2021.09.02 |
[BOJ/백준] 2021 최소 환승 경로 (0) | 2021.09.02 |
[BOJ/백준] 1766 문제집 (0) | 2021.09.02 |