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