2019南京网络赛B supper_log

题目来源:https://nanti.jisuanke.com/t/41299

题意理解完之后发现也就是a的a次幂的a次幂...一共b次,直接欧拉降幂做即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long ll;
const ll MAX=1e6+10;
map<ll,ll>euler;
ll phi[MAX],a[100100];
ll MOD(ll n,ll mod)
{
    return n<mod?n:(n%mod+mod);
}
void Euler()
{
     phi[1]=1;  
     for(ll i=2;i<MAX;i++)  
       phi[i]=i;  
     for(ll i=2;i<MAX;i++)  
        if(phi[i]==i)
           for(ll j=i;j<MAX;j+=i)  
              phi[j]=phi[j]/i*(i-1);
}
ll quickpow(ll a,ll n,ll mod)
{
    ll res=1;
    a=MOD(a,mod);
    while(n)
    {
        if(n&1)
        {
             res=MOD(a*res,mod);
        }
        n>>=1;
         a=MOD(a*a,mod);
    }
    return res;
}
ll solve(ll a,ll b,ll mod)
{
    if(b==1||mod==1)
    return MOD(a,mod);
    {
    	return quickpow(a,solve(a,b-1,phi[mod]),mod);
	}
}
int main()
{
	Euler();
	int T;
	scanf("%d",&T);
	while(T--)
	{
		ll a,b,m;
		scanf("%lld %lld %lld",&a,&b,&m);
		if(b==0)
		{
			printf("%lld\n",1%m);
			continue;
		}
		ll ans=solve(a,b,m);
		ans%=m;
		if(!T)
		printf("%lld",ans);
		else
		printf("%lld\n",ans);
	}
	return 0;
}
发布了56 篇原创文章 · 获赞 17 · 访问量 2321

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/102231191