传送门
裸的求逆元。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long a,b;
//mod为素数时,n为mod-2;mod为合数时,n为phi(mod)-1,phi为欧拉函数
long long pow_mod(long long x,long long n,long long mod){
long long res=1;
while(n>0){
if(n%2==1){
res=res*x%mod;
}
x=x*x%mod;
n/=2;
}
return res;
}
long long prime(long long n){
for(long long i=2;i*i<=n;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
long long euler(long long n){
long long res=n,aa=n;
for(long long i=2;i*i<=n;i++){
if(aa%i==0){
res=res/i*(i-1);
while(aa%i==0){
aa/=i;
}
}
}
if(aa>1){
res=res/aa*(aa-1);
}
return res;
}
int main(){
scanf("%lld%lld",&a,&b);
long long n;
if(prime(b)){
n=b-2;
}else{
n=euler(b)-1;
}
printf("%lld",pow_mod(a,n,b));
return 0;
}