指数循环节
定义
当n很大时,我们需要降幂进行处理
此时,用到一个新的东西,指数循环节
练习题:
套用上面公式(特别是快速幂的部分)即可
此题涉及到快速幂+欧拉函数(可见之前博客)欧拉函数
**注:**只有在B大于等于C的欧拉函数值时,才可以套用此公式。
Code:
const int maxn = 1e6+5;
char str[maxn];
ll gcd(ll a,ll b) {
if(b==0)
return a;
return gcd(b,a%b);
}
ll pow_mod(ll a,ll x,ll mod) {
if(a==0)
return x==0;
ll ans=1;
while(x) {
if(x&1)
ans=ans*a%mod;
x>>=1;
a=a*a%mod;
}
if(ans==0)
return mod;
return ans%mod;
}
ll phi(ll x) {
ll ans=x;
for(int i=2; i*i<=x; i++) {
if(x%i==0)
ans=ans*(i-1)/i;
while(x%i==0)
x/=i;
}
if(x>1)
ans=ans*(x-1)/x;
return ans;
}
ll f(ll x,ll mod){
if(x<10)
return x;
return pow_mod(x%10,f(x/10,phi(mod)),mod);
}
void solve(ll a,char str[],ll c){
ll len=strlen(str);
ll ans=0;
ll p=phi(c);
if(len<=15){
for(int i=0;i<len;i++){
ans=ans*10+str[i]-'0';
}
}
else{
for(int i=0;i<len;i++){
ans=ans*10+str[i]-'0';
ans%=p;
}
ans+=p;
}
printf("%lld\n",pow_mod(a,ans,c));
}
int main() {
ll a,c;
while(cin>>a>>str>>c){
solve(a,str,c);
}
return 0;
}