①计算base的power次方
1,暴力 O(n)
for(int i=1;i<=power;i++)result*=base;
2,优化Ⅰ
#include <iostream>
#include <algorithm>
using namespace std;
long long FastPower(long long base,long long power,long long p)
{
int result=1;
while(power)
{
if(power%2==0)
{
power/=2;
base=base*base%p;
}
else
{
power/=2;
result=result*base%p;
base=base*base%p;
}
}
return result;
}
int main()
{
long long power,base,p;
int n;
cin>>n;
while(n--){
cin>>base>>power>>p;
cout<<FastPower(base,power,p)<<endl;
}
}
原代码基础优化Ⅱ
#include <iostream>
#include <algorithm>
using namespace std;
long long FastPower(long long base,long long power,long long p)
{
int result=1;
while(power)
{
if(power%2==1)
result=result*base%p;
power/=2;
base=base*base%p;
}
return result;
}
int main()
{
long long power,base,p;
int n;
cin>>n;
while(n--){
cin>>base>>power>>p;
cout<<FastPower(base,power,p)<<endl;
}
}
位运算优化Ⅲ
#include <iostream>
#include <algorithm>
using namespace std;
long long FastPower(long long base,long long power,long long p)
{
int result=1;
while(power)
{
if(power&1)
result=result*base%p;
power>>=1;
base=base*base%p;
}
return result;
}
int main()
{
long long power,base,p;
int n;
cin>>n;
while(n--){
cin>>base>>power>>p;
cout<<FastPower(base,power,p)<<endl;
}
}
位运算基本使用方法:二进制左移×2,右移➗2
②计算高精度a*b%p
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long a,b,p,result=0;
cin>>a>>b>>p;
while(b)
{
if(b&1)
result=(result+a)%p;
b>>=1;
a=(2*a)%p;
}
printf("%lld",result%p);
}