HDU 2035-人见人爱A^B(浅谈快速幂)

人见人爱A^B

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 69289 Accepted Submission(s): 45915

Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”

Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Input
2 3
12 6
6789 10000
0 0

Sample Output
8
984
1

题目链接

这道题是HDU上的题目,可以用快速幂做,最后%1000就可以。AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll fastpow(ll,ll);
	ll a,b;
	while(cin>>a>>b)
	{
		if(a==0&&b==0)
		  break;
		ll num=fastpow(a,b);
	    cout<<(num%1000)<<endl; 
	}
	return 0;
}
ll fastpow(ll a,ll b)
{
	ll ans=1;
	while(b!=0)
	{
		if(b&1)
		  ans=(ans*a)%1000;//不要忘了随时对1e3取模
		a=(a*a)%1000;
		b>>=1;
	}
	return ans;
}

今天要讲的主要是快速幂,用3的9次方为例,按照一般算法的话我们要乘9次3才能得到,为了省时间,用快速幂算法,我们都知道任何一个数都可以用二进制数表示出来,例子中所说的9次方,可以写成3的8次方*3的一次方,也就是9可以写成1001,分别对应的是3的一次方,平方,四次方和八次方,这样,我们不断让3进行平方,如果遇到1则乘到ans里面,如果遇到0则继续平方,幂每次右移一位(等价于/2,向下取整),直到最后的幂等于0。返回ans即可。快速幂模板:

ll fastpow(ll a,ll b)
{
	ll ans=1;
	while(b!=0)
	{
		if(b&1)//判断这位是不是1
		  ans*=a;
		a*=a;//平方
		b>>=1;//每次右移一位
	}
	return ans;
}
posted @ 2020-03-01 13:55  Hayasaka  阅读(100)  评论(0编辑  收藏  举报