这是另一种方式。请记住,当我们在 mod 下找到modulo multiplicative inverse
of时。然后a
m
a和m必须coprime
相互配合。
我们可以gcd extended
用来计算modulo multiplicative inverse
。
为了计算a b mod m何时a
并且b
可以有超过 10 个5位,那么计算结果就很棘手。
下面的代码将完成计算部分:
#include <iostream>
#include <string>
using namespace std;
/*
* May this code live long.
*/
long pow(string,string,long long);
long pow(long long ,long long ,long long);
int main() {
string _num,_pow;
long long _mod;
cin>>_num>>_pow>>_mod;
//cout<<_num<<" "<<_pow<<" "<<_mod<<endl;
cout<<pow(_num,_pow,_mod)<<endl;
return 0;
}
long pow(string n,string p,long long mod){
long long num=0,_pow=0;
for(char c: n){
num=(num*10+c-48)%mod;
}
for(char c: p){
_pow=(_pow*10+c-48)%(mod-1);
}
return pow(num,_pow,mod);
}
long pow(long long a,long long p,long long mod){
long res=1;
if(a==0)return 0;
while(p>0){
if((p&1)==0){
p/=2;
a=(a*a)%mod;
}
else{
p--;
res=(res*a)%mod;
}
}
return res;
}
此代码有效,因为a b mod m可以写为(a mod m) b mod m-1 mod m。
希望它有帮助{ :)