原题
Now your task is let another slowly function log* x reach a constant value b. Here log* is iterated logarithm function, it means “the number of times the logarithm function iteratively applied on x before the result is less than logarithm base a”.
Formally, consider a iterated logarithm function
l
o
g
a
∗
log_a^*
loga∗
l
o
g
a
∗
(
x
)
=
{
−
1
   
i
f
x
<
1
1
+
l
o
g
a
∗
(
l
o
g
a
x
)
   
i
f
x
≥
1
log_a^* (x)=\left\{ \begin{aligned} -1& \:\:\:if x<1\\ 1+log_a^*(log_a x)&\:\:\: if x\ge 1 \end{aligned} \right.
loga∗(x)={−11+loga∗(logax)ifx<1ifx≥1
Find the minimum positive integer argument x, let
l
o
g
a
∗
(
x
)
≥
b
log_a^* (x)\ge b
loga∗(x)≥b. The answer may be very large, so just print the result x after m.
Input
The first line of the input is a single integer T
(
T
≤
300
)
(T\le 300)
(T≤300) indicating the number of test cases.
Each of the following lines contains 3 integers a, b and m.
2
≤
a
≤
1000000
0
≤
b
≤
1000000
1
≤
m
≤
1000000
2\le a \le 1000000\\ 0\le b\le 1000000\\ 1\le m \le 1000000
2≤a≤10000000≤b≤10000001≤m≤1000000
Output
For each test case, output x mod m in a single line.
题目分析
可得, x = a a a a . . . m o d   m x=a^{a^{a^{a^{...}}}}mod\: m x=aaaa...modm (共b个a),为降低算法的复杂度,使用快速幂和欧拉降阶定理。
快速幂
对于表达式
a
b
%
p
a^b\%p
ab%p,若使用a连乘b次,时间复杂度为
O
(
b
)
\mathcal{O}(b)
O(b),快速幂方法可以降为
O
(
l
o
g
b
)
\mathcal{O}(log b)
O(logb)
具体实现:
将b化为2进制表示:
a
n
a
n
−
1
.
.
.
a
2
a
1
a
0
a_na_{n-1}...a_2a_1a_0
anan−1...a2a1a0,则
a
b
=
a
a
0
2
0
×
a
a
1
2
1
×
.
.
.
×
a
a
n
2
n
a^b=a^{a_0 2^0}\times a^{a_1 2^1}\times ...\times a^{a_n 2^n}
ab=aa020×aa121×...×aan2n
代码实现为:
long long quick_pow(long long a, long long b, long long mod){
long long res=1;
long long base=a;
while(b!=0){
if(b&1!=0){
res=res*base%mod;
}
base=base*base%mod;
b>>=1;
}
return res;
}
欧拉定理及欧拉降阶公式
欧拉定理:
若n,a为正整数,且n,a互质,则:
a
ϕ
(
n
)
≡
1
(
m
o
d
 
n
)
a^ \phi(n)\equiv1(mod\: n)
aϕ(n)≡1(modn)
ϕ
(
n
)
\phi(n)
ϕ(n)通解公式为
ϕ
(
n
)
=
n
∗
(
1
−
1
p
1
)
(
1
−
1
p
2
)
.
.
.
.
(
1
−
1
p
n
)
\phi(n)=n*(1-\frac{1}{p_1})(1-\frac{1}{p_2})....(1-\frac{1}{p_n})
ϕ(n)=n∗(1−p11)(1−p21)....(1−pn1),
p
i
p_i
pi为n的质因数。
欧拉降阶公式
(mod(p)) a b = { a b % ϕ ( p )     g c d ( a , p ) = 1 a b     g c d ( a , p ) ≠ 1 & b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p )     g c d ( a , p ) ≠ 1 & b ≥ ϕ ( p ) a^b=\left\{ \begin{aligned} a^{b \%\phi(p)}&&\:\:\: gcd(a,p)=1\\ a^b&&\:\:\: gcd(a,p)\neq 1\& b<\phi(p)\\ a^{b\%\phi(p)+\phi(p)}&&\:\:\: gcd(a,p)\neq1\&b\ge\phi(p) \end{aligned} \right.\tag{mod(p)} ab=⎩⎪⎪⎨⎪⎪⎧ab%ϕ(p)abab%ϕ(p)+ϕ(p)gcd(a,p)=1gcd(a,p)̸=1&b<ϕ(p)gcd(a,p)̸=1&b≥ϕ(p)(mod(p))
long long phi(long long n)
{
long long ans=n;
for(long long i=2;i*i<n;i++){
if(n%i==0){
ans-=ans/i;
while(n%i==0){
n/=i;
}
}
}
if(n>2){
ans-=ans/n;
}
return ans;
}
long long f(long long a, long long n, long long mod){
if(n==1){
return a%mod;
}
return quick_pow(a,f(a,n-1,phi(mod)),mod)%mod;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,m;
scanf("%d%d%d",&a,&b,&m);
printf("%lld\n",f(a,b,m)%m);
}
return 0;
}
参考链接:
https://blog.csdn.net/qq_37632935/article/details/81264965