扩展欧拉定理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,m,phi;
string s;
ll calc_phi(ll x){
ll ret=x;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0){
ret=ret/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1)
ret=ret/x*(x-1);
return ret;
}
ll calc_b(){
ll ret=0;
bool k=0;
for(int i=0;i<s.size();i++){
ret=ret*10+s[i]-'0';
if(ret>=phi)
k=1;
ret%=phi;
}
if(k)
ret+=phi;
return ret;
}
ll fpow(ll x,ll y,ll z){
ll ret=1%z;
for(;y;y>>=1,x=x*x%z)
if(y&1)
ret=ret*x%z;
return ret;
}
int main(){
scanf("%lld%lld",&a,&m);
cin>>s;
phi=calc_phi(m);
b=calc_b();
printf("%lld\n",fpow(a%m,b,m));
return 0;
}
\(aka\) \(P5091\) 的答案
欧拉定理
LL euler_phi(LL n){
LL ans=n,i;
for(i=2; i<=sqrt(n); i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)
n=n/i;
}
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}