人见人爱A^B
求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
题目分析
如果暴力pow解决的话,时间复杂度就是o(n),所以要用优化的方式进行,快速幂;
简单举例就是利用二进制的位运算来操作,将次方转化为二进制,然后再将每位二进制转化十进制,进行底数的相乘就可以了;比如这个1101,就是 8+4+0+1;这个题再加个取模就可以了
详细说明 链接:link
快速幂
int poww(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans=x*ans;
x=x*x;
y>>=1
}
}
代码实现
#include<cstdio>
using namespace std;
typedef long long ll;
ll poww(ll x,ll y,ll mod)//快速幂加取模函数
{
ll ans=1;//结果数
while(y)//二进制移位完还有数的话
{
if(y&1)//如果y与1相与为1的话就是二进制末尾位数为1
{
ans=(ans*x)%mod;
}
x=x*x%mod;
y>>=1;//二进制的移位操作向右移动一位二进制
}
return ans;//返回结果
}
int main()
{
int A,B,s;
while(scanf("%ld%ld",&A,&B))
{
if(A==0&&B==0)
break;
s=poww(A,B,1000);
printf("%ld\n",s);
}
}