B.super_log(The Preliminary Contest for ICPC Asia Nanjing 2019)

原题

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 &MediumSpace;&MediumSpace;&MediumSpace; i f x &lt; 1 1 + l o g a ∗ ( l o g a x ) &MediumSpace;&MediumSpace;&MediumSpace; i f x ≥ 1 log_a^* (x)=\left\{ \begin{aligned} -1&amp; \:\:\:if x&lt;1\\ 1+log_a^*(log_a x)&amp;\:\:\: if x\ge 1 \end{aligned} \right. loga(x)={11+loga(logax)ifx<1ifx1
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) (T300) 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 2a10000000b10000001m1000000

Output
For each test case, output x mod m in a single line.

题目分析

可得, x = a a a a . . . m o d &MediumSpace; 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 anan1...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 &MediumSpace; 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(1p11)(1p21)....(1pn1), p i p_i pi为n的质因数。

欧拉降阶公式

(mod(p)) a b = { a b % ϕ ( p ) &MediumSpace;&MediumSpace;&MediumSpace; g c d ( a , p ) = 1 a b &MediumSpace;&MediumSpace;&MediumSpace; g c d ( a , p ) ≠ 1 &amp; b &lt; ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) &MediumSpace;&MediumSpace;&MediumSpace; g c d ( a , p ) ≠ 1 &amp; b ≥ ϕ ( p ) a^b=\left\{ \begin{aligned} a^{b \%\phi(p)}&amp;&amp;\:\:\: gcd(a,p)=1\\ a^b&amp;&amp;\:\:\: gcd(a,p)\neq 1\&amp; b&lt;\phi(p)\\ a^{b\%\phi(p)+\phi(p)}&amp;&amp;\:\:\: gcd(a,p)\neq1\&amp;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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值