Codeforces - Power Tower

题目链接: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;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104214994