만드는 중입니다

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

Exponial

시간 제한2초메모리 제한512 MB

요약
n과 m이 1e9까지 주어질 때 n^(n-1)^(...^1)을 m으로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

유형
정수론, 재귀, 수학
정답자
아직 제출이 없습니다

문제

큰 수를 만드는 방법은 여러 가지가 있다. 예를 들면 다음과 같다.

  • 거듭제곱: 422016=42×42×⋯×42⏟2016개42^{2016} = \underbrace{42 \times 42 \times \cdots \times 42}_{2016 \text{개}}
  • 팩토리얼: 2016!=2016×2015×⋯×2×12016! = 2016 \times 2015 \times \cdots \times 2 \times 1

이 문제에서는 두 연산을 섞은 exponial을 다룬다. exponial은 모든 양의 정수 nn에 대해 다음과 같이 정의된다.

exponial(n)=n(n−1)(n−2)⋯21\mathrm{exponial}(n) = n^{(n-1)^{(n-2)^{\cdots^{2^1}}}}

예를 들어 exponial(1)=1\mathrm{exponial}(1) = 1이고, exponial(5)=54321≈6.206×10183230\mathrm{exponial}(5) = 5^{4^{3^{2^1}}} \approx 6.206 \times 10^{183230}이다. 거듭제곱은 오른쪽부터 계산한다. 즉 abc=a(bc)a^{b^c} = a^{(b^c)}이다.

exponial은 값이 너무 커서 그대로 다루기 어렵다. exponial(n)\mathrm{exponial}(n)을 mm으로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 nn과 mm이 공백을 사이에 두고 주어진다. (1≤n≤1091 \le n \le 10^9, 1≤m≤1091 \le m \le 10^9)

출력

첫째 줄에 exponial(n)\mathrm{exponial}(n)을 mm으로 나눈 나머지를 출력한다.

예제3

  1. 예제 1

    입력
    2 42
    
    예상 출력
    2
    
  2. 예제 2

    입력
    5 123456789
    
    예상 출력
    16317634
    
  3. 예제 3

    입력
    94 265
    
    예상 출력
    39