快速幂计算:
a^11=a(2^0+2^1+2^3)
11的二进制=1011=2^0+2^1+2^3;
所以:
#include <iostream>
using namespace std;
int main()
{
int a,b; //a为底数,b为权
cin>>a>>b;
int ans=1; //结果
while(b!=0)
{
if(b&1) //b&1==0为偶数,b&1==1为奇数
{
ans=ans*a;
}
a=a*a;
b>>=1; //位运算,相当于除以2
}
cout<<ans<<endl;
return 0;
}
快速幂取模:
积的取余等于取余的积的取余。
(a*b)%c=((a%c)*(b%c))%c
#include <iostream>
using namespace std;
int main()
{
int a,b,mode; //a为底数,b为权
cin>>a>>b>>mode;
a=a%mode; //预处理降低a的规模 ,防止a比mode大
int ans=1; //结果
while(b!=0)
{
if(b&1) //b&1==0为偶数,b&1==1为奇数
{
ans=(ans*a)%mode;
}
a=(a*a)%mode;
b>>=1; //位运算,相当于除以2
}
cout<<ans<<endl;
return 0;
}