import Control.Applicative import Data.List modpow :: Integer -> Integer -> Integer -> Integer modpow a b m | b == 0 = 1 | even b = modpow (a * a `mod` m) (b `quot` 2) m | otherwise = a * modpow a (b - 1) m `mod` m tetration :: Integer -> Integer -> Integer tetration a n | a == 1 || n == 0 = 1 | n == 1 = a | n == 2 && a == 2 = 4 | n == 2 && a == 3 = 27 | n == 2 && a == 4 = 256 | n == 3 && a == 2 = 16 | otherwise = 1234567 factors :: Integer -> [Integer] factors n = f n 2 where f :: Integer -> Integer -> [Integer] f n i | i * i > n = if n /= 1 then [n] else [] | n `mod` i == 0 = i : f (n `quot` i) i | otherwise = f n (i + 1) phi :: Integer -> Integer phi n = foldr (\p acc -> (acc `quot` p) * (p - 1)) n $ nub $ factors n modtet :: Integer -> Integer -> Integer -> Integer modtet a n m | m == 1 = 0 | n == 0 = 1 | tetration a n < phi m = modpow a (modtet a (n - 1) (phi m)) m | otherwise = modpow a (modtet a (n - 1) (phi m) + phi m) m main = do [a, n, m] <- map read . words <$> getLine :: IO [Integer] print $ modtet a n m