Yukicoder No.403 2^2^2
solution
数学でやる。計算量は諸々の対数。
${(a^b)}^c = a^{bc}$に関しては、普通に繰り返し二乗法で求めればよい。 $a^{(b^c)}$に関しては、このような法則はない。 しかし法$p = 10^9+7$が素数であるので、Fermatの小定理より$a^{p-1} \equiv 1 \pmod p$である。$k = b^c \bmod p$を求め、これに対し$a^k \bmod p$を求めればよい。
ただし${(a \bmod p)}^{b^c \bmod p}$とすると、$a \equiv b^c \equiv 0 \pmod p$のときが問題になりうる。$0^0$を計算してしまい$1$と答えることのないように注意する。
>>> pow(0, 0)
1
>>> pow(0, 3)
0
>>> pow(3, 3)
27
>>> pow(0, 0, 3)
1
>>> pow(3, 0, 3)
1
>>> pow(3, 3, 3)
0
implementation
pythonのpow
は便利ですね。
#!/usr/bin/env python3
mod = 10**9+7
a, b, c = map(int,input().split('^'))
x = pow(pow(a, b, mod), c, mod)
y = pow(a, pow(b, c, mod-1) + (mod-1), mod)
print(x, y)