나누어떨어지는 연속 부분 수열

면접 대비

시간 제한1초메모리 제한128 MB

요약
주어진 d로 나누어지는 연속 부분배열의 개수를 접두합의 나머지를 이용해 세는 문제입니다.
난이도

보통10점 중 4점

유형
누적 합, 해시맵, 배열
정답자
아직 제출이 없습니다

문제

양의 정수로 이루어진 수열이 주어진다. 이 수열의 연속한 부분 수열 중에서 원소들의 합이 정수 dd로 나누어떨어지는 것이 몇 개인지 세는 프로그램을 작성하시오.

예를 들어 수열 2,1,2,1,1,2,1,22, 1, 2, 1, 1, 2, 1, 2에서 합이 44로 나누어떨어지는 연속 부분 수열은 모두 66개이다. 구체적으로 위치 구간(1부터 시작하며 양 끝을 포함) [1,8][1, 8], [2,4][2, 4], [2,7][2, 7], [3,5][3, 5], [4,6][4, 6], [5,7][5, 7]에 해당하는 부분 수열의 합이 각각 44의 배수이다.

입력

첫째 줄에 테스트 케이스의 개수 cc가 주어진다 (1≤c≤2001 \le c \le 200). 각 테스트 케이스는 두 줄로 이루어진다.

각 테스트 케이스의 첫째 줄에는 나눗셈의 기준이 되는 정수 dd (1≤d≤1,000,0001 \le d \le 1{,}000{,}000)와 수열의 길이 nn (1≤n≤50,0001 \le n \le 50{,}000)이 공백으로 구분되어 주어진다. 둘째 줄에는 수열의 원소 nn개가 공백으로 구분되어 주어지며, 각 원소는 11 이상 1,000,000,0001{,}000{,}000{,}000 이하의 정수이다.

출력

각 테스트 케이스마다 합이 dd로 나누어떨어지는 연속 부분 수열의 개수를 한 줄에 하나씩 출력한다.

예제4

  1. 예제 1

    입력
    2
    7 3
    1 2 3
    4 8
    2 1 2 1 1 2 1 2
    
    예상 출력
    0
    6
    
  2. 예제 2

    입력
    1
    1 5
    1 2 3 4 5
    
    예상 출력
    15
    
  3. 예제 3

    입력
    1
    2 1
    1
    
    예상 출력
    0
    
  4. 예제 4

    입력
    1
    3 4
    1000000000 1000000000 1000000000 1000000000
    
    예상 출력
    2