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