셜록과 순열 정렬 (라지)
시간 제한10초메모리 제한512 MB
순열 1..N의 모든 순열 p에 대해, 각 블록을 따로 정렬해 이어 붙이는 방식으로 나눌 수 있는 최대 블록 수 f(p)의 제곱을 합한 값을 M으로 나눈 나머지를 구한다.
문제
셜록과 왓슨은 프로그래밍 수업에서 정렬을 배웠다. 병렬 계산에 관심이 많은 왓슨은 부터 까지의 정수로 이루어진 순열을 여러 덩어리로 쪼갠 뒤, 각 덩어리를 따로 정렬하고 다시 이어 붙이는 방식으로 전체를 정렬하려고 한다.
순열 에서 덩어리란 연속한 부분 배열이다. 즉 인 두 인덱스 , 에 대해 를 뜻한다.
왓슨은 원소의 순서를 바꾸지 않은 채로 순열을 하나 이상의 덩어리로 나눈다. 모든 원소는 정확히 한 덩어리에 속하고, 한 덩어리의 모든 원소는 그보다 뒤에 있는 모든 덩어리의 모든 원소보다 작아야 한다. 예를 들어 순열 를 나누는 방법은 다음 네 가지뿐이다.
왓슨은 덩어리가 많을수록 기뻐한다. 순열 를 나눌 때 만들 수 있는 덩어리 개수의 최댓값을 라고 하자. 위 예에서 최댓값은 이다.
부터 까지의 수로 만들 수 있는 모든 순열 에 대해 의 합을 구하라. 합이 매우 커질 수 있으므로 으로 나눈 나머지를 출력한다.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다. 이어서 개의 테스트 케이스가 주어진다. 각 테스트 케이스는 두 정수 과 이 공백으로 구분되어 적힌 한 줄로 이루어진다.
출력
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. 는 부터 시작하는 테스트 케이스 번호이고, 는 크기가 인 모든 순열 에 대한 의 합을 으로 나눈 나머지이다.
제한
설명
이면 순열은 하나뿐이고 이므로 제곱의 합은 이다.
이면 순열은 두 개다. 이고 이므로 제곱의 합은 이다.
이면 순열은 여섯 개다. , , , , , 이므로 제곱의 합은 이다.
이 이면 나머지는 항상 이다.