셔플

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

요약
재생 목록 크기 s와 재생 기록이 주어질 때, 기록을 길이 s의 블록들(첫/마지막은 더 짧을 수 있음)로 나누어 각 블록 안에 같은 노래가 중복되지 않도록 하는 시작 오프셋의 개수를 구합니다.
난이도

보통10점 중 6점

유형
슬라이딩 윈도우, 배열, 구현
정답자
아직 제출이 없습니다

문제

주경이는 음악 듣는 것을 좋아하고, 음악을 들을 때 음악 플레이어의 셔플(shuffle) 기능을 사용한다. 플레이어는 재생 목록에 있는 곡들의 순열을 무작위로 하나 만들어 그 순서대로 모든 곡을 재생하고, 목록의 모든 곡을 다 재생하면 다시 새로운 순열(셔플)을 만들어 재생을 이어 간다.

주경이는 지금까지 재생된 곡들의 기록을 가지고 있다. 그런데 이 기록이 맨 처음 곡부터 완전하게 남아 있지는 않다는 것을 알게 되었다. 즉 기록은 재생이 시작된 뒤 어느 시점부터 또 다른 어느 시점까지 이어지는 연속된 구간이다.

재생 목록에 있는 곡의 수를 ss라 하자. 기록은 길이가 ss인 연속한 블록들로 나눌 수 있으며, 맨 앞 블록과 맨 뒤 블록만은 길이가 ss보다 작을 수 있다(각각 어떤 셔플의 뒷부분과 앞부분에 해당한다). 하나의 블록은 한 번의 셔플로 만들어진 하나의 순열의 일부이므로, 같은 블록 안에서는 어떤 곡도 두 번 이상 나타나지 않아야 한다.

기록을 이렇게 블록으로 나누는 방법은 첫 번째 블록 경계의 위치, 즉 00부터 s−1s-1까지의 값 하나로 결정된다. 모든 블록이 조건을 만족하도록 기록을 나눌 수 있는 방법의 수를 구하여라. 이 값이 곧 다음 셔플이 어떻게 이어질 수 있는지에 대한 경우의 수이다.

입력

첫째 줄에 테스트케이스의 수 TT가 주어진다. TT는 100100 이하이다.

각 테스트케이스의 첫째 줄에는 두 정수 ss와 nn이 주어진다 (1≤s,n≤1000001 \le s, n \le 100000). ss는 재생 목록에 있는 곡의 수이고, nn은 지금까지 기록된 곡의 수이다.

둘째 줄에는 재생된 곡을 나타내는 nn개의 정수 x1,x2,…,xnx_1, x_2, \ldots, x_n이 공백으로 구분되어 주어진다 (1≤xi≤s1 \le x_i \le s).

출력

각 테스트케이스마다, 기록을 조건에 맞게 블록으로 나눌 수 있는 방법의 수(첫 번째 블록 경계로 가능한 위치의 개수)를 한 줄에 출력한다. 가능한 방법이 하나도 없으면 00을 출력한다.

예제5

  1. 예제 1

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

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

    입력
    3
    10 4
    7 2 9 4
    5 2
    3 3
    7 7
    1 2 3 4 5 6 7
    
    예상 출력
    10
    1
    7
    
  4. 예제 4

    입력
    4
    100000 1
    50000
    2 2
    1 2
    2 4
    1 2 1 2
    3 3
    2 2 2
    
    예상 출력
    100000
    2
    2
    0
    
  5. 예제 5

    입력
    3
    6 3
    2 4 6
    8 8
    8 7 6 5 4 3 2 1
    4 6
    1 2 3 4 1 2
    
    예상 출력
    6
    8
    4