ACM:快速幂

快速幂计算:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_43678290/article/details/85646602