The Preliminary Contest for ICPC Asia Nanjing 2019 super_log

The Preliminary Contest for ICPC Asia Nanjing 2019

B题:super_log

a a a … a % m a^{a^{a^{…^a}}}\%m aaaa%m(b次a)
考虑欧拉降幂:
a b ≡ a b % φ ( p ) + φ ( p ) m o d p ( b ≥ φ ( p ) ) a^b\equiv a^{b\%\varphi(p)+\varphi(p)}mod p(b\geq \varphi(p)) abab%φ(p)+φ(p)modp(bφ(p))
疯狂特判。。。。

#include<cstdio>
#define ll long long
using namespace std;
const int maxn = 1e6+10;
const ll N=1e18;
int T;
int phi[maxn],p[1000];
ll qpow(ll a,ll b,ll mod){
	ll res=1;
	while(b!=0){
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
void phi_table(int N, int* phi) {
  for (int i = 2; i <= N; i++) phi[i] = 0;
  phi[1] = 1;
  for (int i = 2; i <= N; i++)
    if (!phi[i])
      for (int j = i; j <= N; j += i) {
        if (!phi[j]) phi[j] = j;
        phi[j] = phi[j] / i * (i - 1);
      }
}
bool check(int a,int b,int p){
	if(b==0)return 1>=p;
	if(b==1)return a>=p;
	if(b==2){
		if(a>=8)return true;
		else return qpow(a,a,N)>=(ll)p;
	}
	if(a==1)return 1>=p;
	if(a==2){
		if(b==3)return 16>=p;
		if(b==4)return 65536>=p;
		else if(b>4)return true;
	}
	if(a>=3)return true;
}
ll f(int a,int b){
	if(b==0)return 1;
	else if(b==1)return a;
	else {
		if(a==1)return 1;
		else{
			return qpow((ll)a,f(a,b-1),N);
		}
	}
}
ll solve(int a,int b,int p){
	if(p==1)return 0;
	if(b==1)return a%p;
	if(b==0)return 1%p;
	if(check(a,b-1,phi[p])){
		return qpow((ll)a,solve(a,b-1,phi[p])+phi[p],(ll)p);
	}
	return qpow((ll)a,f(a,b-1),(ll)p);
}
int main(){
	int a,b,m;
	phi_table(1000000,phi);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&a,&b,&m);
		ll ans=solve(a,b,m);
		printf("%lld\n",ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值