1. 程式人生 > >ACM:快速冪

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