快速幂

其实很好理解的,O(lg b)的时间复杂度,b是指数

点我打开百科链接

我就大概说一下。

如果b = 11, 那么对应的二进制为1011,即答案

11的二进制是1011

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

那么就刚好一一对应

上代码(如果没有mod,数据很大,就要开高精度):

unsiged long long fastpow(unsigned long long a, unsigned long long b)
{
	unsigned long long r = 1, t = a; //t先等于a,这样好算a^1,a^2,a^4...的,然后将结果乘上即可
	while(b)
	{
		if(b & 1) //如果二进制末位有1,&是位运算与
			r *= t; //有1,就将答案乘上t
		t *= t; //更新a^i
		b >>= 1; //向右移走一个1的位
	}
	return r;
}

如果题目有要mod的(即应该不用开高精度的):

int fastmodpow(int a, int b, int c)
{
	int r = 1, t = a;
	while(b)
	{
		if(!r) break; //当r为0后,将来的任何乘以就无意义,所以退出
		if(b & 1)
			r = (r * t) % c; //因为r和t都是mod过了的,所以在内部不用mod
		t = (t * t) % c; //因为t是mod过了的,所以在内部不用mod
		b >>= 1;
	}
	return r;
}

 

posted @ 2014-01-02 23:56  iwtwiioi  阅读(231)  评论(0编辑  收藏  举报