我们定义 a # b = a a a a … a \# b=a^{a^{a^{a\ldots}}} a#b=aaaa…
求a#b%(1e9+7)的值
1 ≤ a , b ≤ 1 0 16 1\le a,b\le 10^{16} 1≤a,b≤1016
首先补充有关同余符号的运算
已知 a ≡ b ( m o d    x ) ; c , d ∈ N + ; y ∈ N + a\equiv b(\mod x);c,d \in N^+;y \in N^+ a≡b(modx);c,d∈N+;y∈N+
那么有
a ± c ≡ b ± c a \pm c \equiv b \pm c a±c≡b±c
a ± b y ≡ b ± a y a \pm by \equiv b\pm ay a±by≡b±ay
a ± c x ≡ b ± d y a \pm cx \equiv b \pm dy a±cx≡b±dy
由费马小定理得 a p ≡ a , p 为 质 数 a^p \equiv a,p为质数 ap≡a,p为质数
∵ a p ≡ a , \because a^p \equiv a, ∵ap≡a,
得
∀ k ∈ N + \forall k\in N^+ ∀k∈N+
∴ a p − 1 m o d    p − 1 = 1 m o d    p \therefore a^{p-1} \mod {p-1}=1 \mod p ∴ap−1modp−1=1modp
a k m o d    p × a p − 1 = 1 m o d    p × a k m o d    p a^k \mod p \times a^{p-1}=1 \mod p \times a^k \mod p akmodp×ap−1=1modp×akmodp
移项得
a k ≡ a k a p − 1 = a k − ( p − 1 ) ( a k m o d    p = a k − ( p − 1 ) m o d    p ) a^k\equiv \frac{a^k}{a^{p-1}}=a^{k-(p-1)}(a^k \mod p=a^{k-(p-1)} \mod p) ak≡ap−1ak=ak−(p−1)(akmodp=ak−(p−1)modp)
我们考虑 a # b a\#b a#b
对于 a a a a … [ 1 式 ] a^{a^{a^{a\ldots}}}[1式] aaaa…[1式]有
1式 = a a b − 1 =a^{a^{b-1}} =aab−1(手推一下就知道了)
update: 鉴于有童鞋问我这里是如何得到的我们在这里更新一下上式的推导过程
a a a a^{a^a} aaa
= ( a × a × a × ⋯ × a ) a ( a 个 ) =(a \times a\times a\times \cdots \times a)^a(a个) =(a×a×a×⋯×a)a(a个)
= a a × a a × a a ⋯ × a a ( a 个 ) =a^a \times a^a \times a^a \cdots \times a^a(a个) =aa×aa×aa⋯×aa(a个)
= a × a × a × a ⋯ × a ( a 2 个 ) =a \times a\times a\times a \cdots \times a(a^2个) =a×a×a×a⋯×a(a2个)
由此递推可知
a a b − 1 ≡ a a b − 1 m o d    ( p − 1 ) ( m o d    p ) a^{a^{b-1}} \equiv a^{a^{b-1}\mod(p-1)}(\mod p) aab−1≡aab−1mod(p−1)(modp)
我们来证明上式是正确性
假设 k > p k>p k>p(不然模p也没什么意思)
那么存在 n n n使得
a m = a n ( p − 1 ) × a m m o d    ( p − 1 ) a^m =a^{n(p-1) }\times a^{m\mod(p-1)} am=an(p−1)×ammod(p−1)
根据费马小定理得
a m ≡ a m m o d    ( p − 1 ) a^m\equiv a^{m\mod(p-1)} am≡ammod(p−1)
∴ \therefore ∴当 a b − 1 = m a^{b-1}=m ab−1=m时
a a b − 1 ≡ a a b − 1 m o d    ( p − 1 ) ( m o d    p ) a^{a^{b-1}} \equiv a^{a^{b-1}\mod(p-1)}(\mod p) aab−1≡aab−1mod(p−1)(modp)
1.一定要开long long
2. 快速幂最好用位运算
#include
#define ll long long
const ll mod=1e9+7;
ll n,m;
ll qpow(ll a,ll b,ll mod)
{
ll res=1,base=a;
while(b)
{
if(b&1)res=(res%mod)*(base%mod)%mod;
base=(base%mod)*(base%mod)%mod;
b>>=1;
}
return res%mod;
}
int main()
{
scanf("%lld%lld",&n,&m);
printf("%lld",qpow(n,qpow(n,m-1,mod-1),mod));
return 0;
}