포병대 발사 순서
시간 제한1초메모리 제한1024 MB
대포를 쏘는 순서 중 인접한 대포 번호 차이의 합이 최대인 값, 그 순서의 개수를 10^9+7로 나눈 나머지, 첫 번째와 M번째 순서를 구합니다.
문제
용감한 병사 슈베이크는 제14 기마포병연대에 복무하며 체스케 부데요비체에 도착했다. 뜻밖에도 핑크 폰 핑켄슈타인 장군이 연대를 사열하러 온다. 루카시 중위는 대포 문을 일렬로 세우고, 각 대포를 정확히 한 번씩 발사해야 한다(물론 모두 말이 끄는 대포다).
안타깝게도 포성에 말들이 놀란다. 연이어 발사하는 대포끼리 가까울수록 말이 받는 충격이 커진다. 그래서 루카시 중위는 슈베이크에게 연속으로 발사하는 대포끼리 최대한 멀리 떨어지도록 발사 순서를 짜 달라고 부탁한다. 정확히 말하면 거리의 합을 최대로 만들어야 한다.
문의 대포에 대한 발사 순서는 수 의 순열 이다. 여기서 은 가장 먼저 발사하는 대포의 번호, 는 번째로 발사하는 대포의 번호, 은 마지막에 발사하는 대포의 번호이다. 이 순서의 거리 합은 이다.
순서는 다음 규칙으로 나열한다. 두 순서 와 의 앞 개 원소가 같고 번째 원소가 다르면, 번째 원소가 더 작은 순서가 목록에서 앞에 온다.
루카시 중위는 장군이 좋아하는 숫자가 이며, 장군이 목록에서 번째에 있는 순서대로 발사하라고 요구할 가능성이 크다고 생각한다.
슈베이크를 돕기 위해 다음 값을 계산하는 프로그램을 작성하라.
- , 가능한 거리 합의 최댓값
- , 거리 합이 최대인 발사 순서의 총 개수
- 거리 합이 최대인 모든 순서의 목록에서 첫 번째 순서
- 거리 합이 최대인 모든 순서의 목록에서 번째 순서
입력
입력은 한 줄이며, 두 정수 (대포의 수, )과 (장군이 좋아하는 숫자, )이 주어진다. 여기서 는 거리 합이 최대인 발사 순서의 총 개수이다.
출력
첫 줄에는 최대 거리 합 와, 거리 합이 인 발사 순서의 총 개수 를 로 나눈 나머지를 출력한다. 둘째 줄에는 거리 합이 최대인 순서 목록의 첫 번째 순서를 개의 정수로 출력한다. 셋째 줄에는 같은 목록의 번째 순서를 개의 정수로 출력한다.