链接
\(\text{2019南京网络赛-B.super_log}\)
题意
有一个分段函数如下: 现在需要你找到最小的正整数\(x\),使得\(log_{a}^* (x) \ge b\),由于结果可能会非常大,所以需要你输出\(x\)对\(m\)取余后的结果。
输入格式:共\(t\)组测试样例,每组样例有一行,一行三个数\(a,b,m\).
数据范围:\(1\leq a\leq 1000000,0\leq b\leq 1000000\),\(1\leq m\leq 1000000\).
输出格式:每行对应一个样例结果。
分析
实际上这里是要计算\(a^{a^{a^{\dots}}}\%m\)这里共\(b\)个\(a\),这是一个幂塔函数,显然是不能够直接计算的。
考虑欧拉降幂,如下:
\[a^b\equiv \begin{cases} a^{b\space \text{mod}\space \phi(m)+\phi(m)} &b\geq \phi(m)\\ a^b& b<\phi(m) \end{cases}(\text{mod}\space m)\]
显然直接套用公式即可, \[a^{a^{a^{\dots}}} = a(a^{a^{a^{\dots}}}\text{mod}\space \phi(m)+\phi(m))(\text{mod}\space m)\]
从上式可知,我们递归进行即可。
如果\(a\)是无限的,即乘方塔的层数无限,那么显然欧拉降幂公式里的\(b\)(\(b\)在这里是\(a^{a^{a^{\dots}}}\))一定是恒大于\(\phi(m)\),如果\(a\)的层数是有限的,那么我们在计算过程中就需要对\(b\)(\(b\)在这里是\(a^{a^{a^{\dots}}}\))与\(\phi(m)\)的大小进行判断。
并且这里我们不知道最终的\(\phi(m)\)是多少,所以需要进行递归计算。具体细节见代码。
代码
1 |
|