【模板】扩展欧拉定理
题目大意:求$$a^b\ mod \ m$$
题解:
扩展欧拉定理成立的条件是 \(b\ge \varphi (m)\)
注意:质因数分解尽量传递值到函数内部,否则分解过程中会对原来的值进行修改,容易出现奇怪的错误。
代码如下
#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 f=0;
for(int i=0;i<s.size();i++){
ret=ret*10+s[i]-'0';
if(ret>=phi)f=1;
ret%=phi;
}
if(f)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(){
cin>>a>>m>>s;
phi=calc_phi(m);
b=calc_b();
printf("%lld\n",fpow(a%m,b,m));
return 0;
}