一、欧拉函数
欧拉函数是用来求n的质因数的个数。
ll ouler(ll n){
ll ans=n,a=n;
for(ll i=2;i*i<=a;i++){
if(a%i==0){
ans-=ans/i;
while(a%i==0){
a/=i;
}
}
}
if(a>1){
ans-=ans/a;
}
return ans;
}
void ouler(){
euler[1]=1;
for(int i=2;i<Max;i++)
euler[i]=i;
for(int i=2;i<Max;i++)
if(euler[i]==i)//如果i是质数
for(int j=i;j<Max;j+=i)
euler[j]=euler[j]/i*(i-1);//提一个1/i,先进行除法是为了防止中间数据的溢出
return ;
}
二、快速幂(具体可以看这篇博文)
ll qmod(ll a,ll n,ll mod){
ll tmp=a%mod,ans=1;
while(n){
if(n&1){
ans=(ans*tmp)%mod;
}
tmp=tmp*tmp%mod;
n>>=1;
}
return ans;
}
三、欧拉降幂
1、公式
2、模板
#include<iostream>
#include<cstring>
using namespace std;
typedef __int64 ll;
char b[1000006];
ll ouler(ll n){
ll ans=n,a=n;
for(ll i=2;i*i<=a;i++){
if(a%i==0){
ans-=ans/i;
while(a%i==0){
a/=i;
}
}
}
if(a>1){
ans-=ans/a;
}
return ans;
}
ll qmod(ll a,ll n,ll mod){
ll tmp=a%mod,ans=1;
while(n){
if(n&1){
ans=(ans*tmp)%mod;
}
tmp=tmp*tmp%mod;
n>>=1;
}
return ans;
}
//利用公式
ll solve(ll a,char *b,ll c){
int PHI=ouler(c);
ll res=0;
for(int i=0;b[i];i++)
{
res=(res*10+b[i]-'0');
if(res>c)break;
}
if(res<=PHI)
{
return qmod(a,res,c);
}
else
{
res=0;
for(int i=0;b[i];i++)
{
res=(res*10+b[i]-'0')%PHI;
}
return qmod(a,res+PHI,c);
}
}
int main(){
ll a,c,i;
ll n=0,tmp;
while(scanf("%I64d%s%I64d",&a,b,&c)!=EOF){
printf("%I64d\n",solve(a,b,c));
}
return 0;
}