题目链接:Codeforces - Power Tower
可以注意到欧拉函数下降的速度是很快的,很快就能到1。所以暴力降幂即可。
注意快速幂的时候也需要降幂。因为如果快速幂中途出现了>=MOD的情况我们要加上MOD,以满足欧拉降幂的公式。
AC:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,phi[100],a[N];
int get(int x){
int res=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
inline int mod(int x,int p){return x>=p?x%p+p:x;}
inline int qmi(int a,int b,int p){
int res=1;
while(b){
if(b&1) res=mod(res*a,p); b>>=1; a=mod(a*a,p);
}
return res;
}
int dfs(int l,int r,int id){
if(l==r||phi[id]==1) return mod(a[l],phi[id]);
return qmi(a[l],dfs(l+1,r,id+1),phi[id]);
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>phi[0];
for(int i=1;i<=30;i++) phi[i]=get(phi[i-1]);
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
for(int i=1,l,r;i<=m;i++){
cin>>l>>r;
cout<<dfs(l,r,0)%phi[0]<<'\n';
}
return 0;
}
来源:CSDN
作者:青烟绕指柔!
链接:https://blog.csdn.net/weixin_43826249/article/details/104214994