만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

카드 정렬

시간 제한4초메모리 제한1024 MB

요약
n장의 카드가 만드는 모든 순열에 대해 정렬 시간의 합을 m으로 나눈 나머지를 구합니다.
난이도

보통10점 중 7점

유형
조합론, 수학, 구현
정답자
아직 제출이 없습니다

문제

Bajtazar는 브리지를 즐기지만 손에 든 카드를 빠르게 정리하는 데 어려움을 겪는다. 그래서 동료들과 다음 게임을 하기 전에 카드 정리를 연습하려 한다.

그는 1부터 nn까지 번호가 매겨진 연습용 카드 덱을 nn장 준비했다. 연습은 카드를 섞는 것으로 시작하며, 그 결과 손에 든 카드가 하나의 순열이 된다. 그다음 카드를 번호의 오름차순으로 정렬한다.

카드가 정렬되어 있지 않은 동안, Bajtazar는 다음 연산을 반복한다. 손에 든 첫 번째 카드의 번호를 kk라고 하고, 손에서 번호가 k−1k-1인 카드를 찾는다(k=1k = 1이면 번호가 nn인 카드를 찾는다). 그 카드를 맨 앞으로 옮긴다. 이 연산의 소요 시간은 찾은 카드가 맨 앞에서 떨어진 거리에 비례한다. 정렬 시간은 수행한 모든 연산 시간의 합이다.

예를 들어 순열 5 6 3 7 1 4 2의 정렬 시간은 5+3+6+6=205 + 3 + 6 + 6 = 20이다. 연산의 순서는 다음과 같다.

5 6 3 7 1 4 2 → 4 5 6 3 7 1 2 → 3 4 5 6 7 1 2 → 2 3 4 5 6 7 1 → 1 2 3 4 5 6 7

Bajtazar는 가능한 n!n!개의 모든 순열에 대해 정렬을 연습하고 싶어 한다. 그가 이 생각을 단념하도록, 모든 순열의 정렬 시간 합을 구하는 프로그램을 작성하라. 지금은 그 합을 mm으로 나눈 나머지만 구하면 된다.

입력

첫 번째이자 유일한 줄에 두 정수 nn과 mm이 주어진다(2≤n≤1 000 0002 \le n \le 1\,000\,000, 2≤m≤1 000 000 0002 \le m \le 1\,000\,000\,000).

출력

모든 n!n!개의 순열에 대한 정렬 시간의 합을 mm으로 나눈 나머지를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    2 100
    
    예상 출력
    1