셜록과 순열 정렬 (Small)

1부터 N까지의 모든 순열에 대해, 앞 덩어리의 모든 값이 뒤 덩어리보다 작도록 나누는 최대 덩어리 수 f(p)를 구하고 f(p)^2의 합을 M으로 나눈 나머지를 출력한다.

보통7동적 계획법조합론수학누적 합아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

왓슨은 병렬 계산에 관심이 많다. 그래서 1부터 NN까지의 정수로 이루어진 순열을 여러 덩어리로 쪼갠 다음, 각 덩어리를 따로 정렬하고 다시 이어 붙이는 방식으로 정렬하려고 한다.

순열 p1,p2,,pNp_1, p_2, \ldots, p_N에서 덩어리는 연속한 부분 배열이다. 즉 1ijN1 \le i \le j \le N인 인덱스 iijj에 대해 원소 pi,pi+1,,pjp_i, p_{i+1}, \ldots, p_j를 뜻한다.

왓슨은 원소의 순서를 그대로 둔 채 순열을 하나 이상의 덩어리로 이루어진 순서 있는 목록으로 나눈다. 이때 모든 원소는 정확히 한 덩어리에 속하고, 한 덩어리의 모든 원소는 그 뒤에 오는 모든 덩어리의 모든 원소보다 작아야 한다. 예를 들어 순열 [2, 1, 3, 5, 4]를 나누는 방법은 다음 네 가지뿐이다.

[[2, 1, 3], [5, 4]]
[[2, 1], [3, 5, 4]]
[[2, 1], [3], [5, 4]]
[[2, 1, 3, 5, 4]]

왓슨은 덩어리가 많을수록 기뻐한다. 순열 pp에서 만들 수 있는 덩어리의 최대 개수를 f(p)f(p)라고 쓴다. 위 순열에서는 f(p)=3f(p) = 3이다.

1부터 NN까지의 수로 만드는 모든 순열 pp에 대해 f(p)2f(p)^2의 합을 구하라. 합이 매우 커질 수 있으므로 MM으로 나눈 나머지를 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 다음 TT개의 줄에 각각 두 정수 NNMM이 주어진다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy는 크기가 NN인 모든 순열 pp에 대한 f(p)2f(p)^2의 합을 MM으로 나눈 나머지이다.

제한

  • 1T1001 \le T \le 100
  • 1N1001 \le N \le 100
  • 1M1091 \le M \le 10^9

MM이 소수라는 보장은 없고, M=1M = 1도 주어질 수 있다.

설명

N=1N = 1이면 순열이 하나뿐이고 f([1])=1f([1]) = 1이므로 제곱의 합은 1이다.

N=2N = 2이면 순열이 둘이고 f([1,2])=2f([1, 2]) = 2, f([2,1])=1f([2, 1]) = 1이므로 제곱의 합은 22+12=52^2 + 1^2 = 5이다.

N=3N = 3이면 여섯 순열에서 f([1,2,3])=3f([1, 2, 3]) = 3, f([1,3,2])=2f([1, 3, 2]) = 2, f([2,1,3])=2f([2, 1, 3]) = 2, f([2,3,1])=1f([2, 3, 1]) = 1, f([3,1,2])=1f([3, 1, 2]) = 1, f([3,2,1])=1f([3, 2, 1]) = 1이므로 제곱의 합은 32+22+22+12+12+12=203^2 + 2^2 + 2^2 + 1^2 + 1^2 + 1^2 = 20이다.