例如(7^7)%4
可以看为
((7%4)^7)%4
(3^7)%4
(((3*3)%4)^6)%4
(1^6)%4
(1^(2*3))%4 // 就像将(7^16)变成(49^8)
(1^3)%4.......
下面是对应代码 :a为底数,b是指数,m是要准备取模的数
long long Mode(long long a,long long b,long long m)
{
long long sum=1;
a=a%m;
while(b>0)
{
if(b%2==1)
{
sum=(sum*a)%m;
}
b/=2;
a=(a*a)%m;
}
return sum;
}
同理,如果只是需要求a^b,那么不在每步上取模就可以了。
HDU2035
人见人爱A^B
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 789 10000 0 0
Sample Output
8 984 1
明显需要快速幂的运算,但是题目要求只输出结果的最后三位数字,那么在每一步上对1000取模即可!
import java.util.*;
public class Main {
public static long fun(int n1,int n2) {
long sum=1;
while(n2>0) {
if(n2%2==1)
{
sum=(sum*n1)%1000;
}
n2/=2;
n1=(n1*n1)%1000;
}
return sum;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt(),m=sc.nextInt();
if(n==0&&m==0)
break;
long ans=fun(n,m);
System.out.println(ans);
}
}
}