셜록과 순열 정렬 (Small)
시간 제한5초메모리 제한512 MB
1부터 N까지의 모든 순열에 대해, 앞 덩어리의 모든 값이 뒤 덩어리보다 작도록 나누는 최대 덩어리 수 f(p)를 구하고 f(p)^2의 합을 M으로 나눈 나머지를 출력한다.
문제
왓슨은 병렬 계산에 관심이 많다. 그래서 1부터 까지의 정수로 이루어진 순열을 여러 덩어리로 쪼갠 다음, 각 덩어리를 따로 정렬하고 다시 이어 붙이는 방식으로 정렬하려고 한다.
순열 에서 덩어리는 연속한 부분 배열이다. 즉 인 인덱스 와 에 대해 원소 를 뜻한다.
왓슨은 원소의 순서를 그대로 둔 채 순열을 하나 이상의 덩어리로 이루어진 순서 있는 목록으로 나눈다. 이때 모든 원소는 정확히 한 덩어리에 속하고, 한 덩어리의 모든 원소는 그 뒤에 오는 모든 덩어리의 모든 원소보다 작아야 한다. 예를 들어 순열 [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]]
왓슨은 덩어리가 많을수록 기뻐한다. 순열 에서 만들 수 있는 덩어리의 최대 개수를 라고 쓴다. 위 순열에서는 이다.
1부터 까지의 수로 만드는 모든 순열 에 대해 의 합을 구하라. 합이 매우 커질 수 있으므로 으로 나눈 나머지를 출력한다.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다. 다음 개의 줄에 각각 두 정수 과 이 주어진다.
출력
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. 는 1부터 시작하는 테스트 케이스 번호이고, 는 크기가 인 모든 순열 에 대한 의 합을 으로 나눈 나머지이다.
제한
이 소수라는 보장은 없고, 도 주어질 수 있다.
설명
이면 순열이 하나뿐이고 이므로 제곱의 합은 1이다.
이면 순열이 둘이고 , 이므로 제곱의 합은 이다.
이면 여섯 순열에서 , , , , , 이므로 제곱의 합은 이다.