Codeforces 906 D. Power Tower
http://codeforces.com/contest/906/problem/D
欧拉降幂
#include<cstdio> #include<iostream> using namespace std; int pi[35],phi[35],lim; int a[100001]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int get_phi(int n) { int ph=n; for(int i=2;i*i<=n;++i) if(!(n%i)) { ph=ph/i*(i-1); while(!(n%i)) n/=i; } if(n>1) ph=ph/n*(n-1); return ph; } int Pow(int a,int b,int mod,bool &flag) { int res=1; while(b) { if(b&1) { flag|=(1LL*res*a>=mod); res=1LL*res*a%mod; } flag|=(1LL*a*a>=mod); a=1LL*a*a%mod; b>>=1; } return res; } int f(int x,int dep) { if(dep>lim) { x-=dep-lim; dep=lim; } if(dep==1) return a[x]%pi[1]; int tmp=a[x]; if(tmp>=phi[dep-1]) tmp=tmp%phi[dep-1]+phi[dep-1]; x--; bool flag; for(int i=dep-1;i;--i) { flag=false; tmp=Pow(a[x],tmp,pi[i],flag); if(flag) tmp+=phi[i-1]; x--; } return tmp; } int main() { // freopen("data.in","r",stdin); // freopen("my.out","w",stdout); int n,mod; read(n); read(mod); for(int i=1;i<=n;++i) read(a[i]); int tmp=mod; while(pi[lim]!=1) { pi[++lim]=tmp; phi[lim]=get_phi(tmp); tmp=phi[lim]; } int q; read(q); int l,r; while(q--) { read(l); read(r); printf("%d\n",f(r,r-l+1)); } return 0; }