缩略题目
In Complexity theory, some functions are nearly O(1)O(1), but it is greater then O(1)O(1). For example, the complexity of a typical disjoint set is O(nα(n))O(nα(n)). Here α(n)α(n) is Inverse Ackermann Function, which growth speed is very slow. So in practical application, we often assume α(n) \le 4α(n)≤4.
…
计蒜客上的LaTeX复制后搞得我很难受,不想一一改了,具体题目点题目链接吧。
题意
很复杂,但意思就是求一个:
a
a
a
a
.
.
.
m
o
d
(
m
)
a^{a^{a^{a^{...}}}} mod(m)
aaaa...mod(m)
共有b个a。
我的理解
欧拉降幂:
当a与m互质,则:
当a与m不互质,则:
因为a和m不保证互质,所以要考虑a与m的互质情况。
当 p h i ( m ) = 1 phi(m) = 1 phi(m)=1时,欧拉降幂可以提前结束,则直接返回。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,mod;
ll mod_pow(ll a, ll n, ll mod) {
a %= mod;
ll ret = 1;
while (n) {
if (n & 1) ret = (ret*a) % mod;
a = a*a%mod;
n >>= 1;
}
return ret;
}
ll euler(ll n) {
ll ans = n;
for (ll i = 2; i*i <= n; i++) {
if (n%i == 0)
{
ans -= ans / i;
while (n%i == 0) n /= i;
}
}
if (n>1) ans -= ans / n;
return ans;
}
ll dfs(ll n,ll m,int time){
if(m == 1) return 0;
if(time==0) return 1;
ll phim = euler(m);
ll exp = dfs(n,phim,time-1);
if(exp<phim && exp)
return mod_pow(n,exp,m);
else
return mod_pow(n,exp+phim,m);
}
int main(){
int t;cin>>t;
while(t--){
scanf("%lld%lld%lld",&a,&b,&mod);
ll ans = dfs(a,mod,b);
printf("%lld\n",ans);
}
return 0;
}