만드는 중입니다

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

포병대 발사 순서

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

요약
대포를 쏘는 순서 중 인접한 대포 번호 차이의 합이 최대인 값, 그 순서의 개수를 10^9+7로 나눈 나머지, 첫 번째와 M번째 순서를 구합니다.
난이도

보통10점 중 7점

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

문제

용감한 병사 슈베이크는 제14 기마포병연대에 복무하며 체스케 부데요비체에 도착했다. 뜻밖에도 핑크 폰 핑켄슈타인 장군이 연대를 사열하러 온다. 루카시 중위는 대포 NN문을 일렬로 세우고, 각 대포를 정확히 한 번씩 발사해야 한다(물론 모두 말이 끄는 대포다).

안타깝게도 포성에 말들이 놀란다. 연이어 발사하는 대포끼리 가까울수록 말이 받는 충격이 커진다. 그래서 루카시 중위는 슈베이크에게 연속으로 발사하는 대포끼리 최대한 멀리 떨어지도록 발사 순서를 짜 달라고 부탁한다. 정확히 말하면 거리의 합을 최대로 만들어야 한다.

NN문의 대포에 대한 발사 순서는 수 1…N1 \dots N의 순열 PP이다. 여기서 P1P_1은 가장 먼저 발사하는 대포의 번호, PiP_i는 ii번째로 발사하는 대포의 번호, PNP_N은 마지막에 발사하는 대포의 번호이다. 이 순서의 거리 합은 S=∣P1−P2∣+∣P2−P3∣+⋯+∣PN−1−PN∣S = |P_1-P_2| + |P_2-P_3| + \dots + |P_{N-1}-P_N|이다.

순서는 다음 규칙으로 나열한다. 두 순서 PP와 QQ의 앞 i−1i-1개 원소가 같고 ii번째 원소가 다르면, ii번째 원소가 더 작은 순서가 목록에서 앞에 온다.

루카시 중위는 장군이 좋아하는 숫자가 MM이며, 장군이 목록에서 MM번째에 있는 순서대로 발사하라고 요구할 가능성이 크다고 생각한다.

슈베이크를 돕기 위해 다음 값을 계산하는 프로그램을 작성하라.

  • SS, 가능한 거리 합의 최댓값
  • KK, 거리 합이 최대인 발사 순서의 총 개수
  • 거리 합이 최대인 모든 순서의 목록에서 첫 번째 순서
  • 거리 합이 최대인 모든 순서의 목록에서 MM번째 순서

입력

입력은 한 줄이며, 두 정수 NN(대포의 수, 2≤N≤1052 \le N \le 10^5)과 MM(장군이 좋아하는 숫자, 1≤M≤min⁡(1018,K)1 \le M \le \min(10^{18}, K))이 주어진다. 여기서 KK는 거리 합이 최대인 발사 순서의 총 개수이다.

출력

첫 줄에는 최대 거리 합 SS와, 거리 합이 SS인 발사 순서의 총 개수 KK를 1 000 000 0071\,000\,000\,007로 나눈 나머지를 출력한다. 둘째 줄에는 거리 합이 최대인 순서 목록의 첫 번째 순서를 NN개의 정수로 출력한다. 셋째 줄에는 같은 목록의 MM번째 순서를 NN개의 정수로 출력한다.

예제1

  1. 예제 1

    입력
    5 3
    
    예상 출력
    11 8
    2 4 1 5 3
    3 1 5 2 4