题目:
取模运算的拓展:
1,(a + b) % p = (a % p + b % p) % p
2,(a - b) % p = (a % p - b % p ) % p
3,(a * b) % p = (a % p * b % p) % p
代码:
package 分治;
import java.util.Scanner;
public class Main快速幂 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long base=sc.nextLong();
long power=sc.nextLong();
System.out.println(Mi(base,power));
}
private static long Mi(long base, long power) {
long result=1;
while(power>0){
if (power%2==0){
power=power/2;//指数为偶数,缩小为原来的一半
base=base*base%1000;//底数变为原来的平方
}
else{//指数为奇数时
power=power-1;//先变为偶数
result=result*base%1000;//分离出来的底数收集好
power=power/2;
base=base*base%1000;//底数变为原来的平方
}
}
return result;
}
}
洛谷的一个题目:P1226 【模板】快速幂||取余运算
题目:
代码:(88分,不知道错哪,大佬教教我)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long b,p,k;
b=sc.nextLong();
p=sc.nextLong();
k=sc.nextLong();
System.out.println(ff(b,p,k));
}
//b为底数,p为指数,k为取的模
private static String ff(long b, long p, long k) {
long b1=b;
long p1=p;
long result=1;
while(p>0){
if (p%2==0){//指数为偶数
p=p/2;//指数变为一半
b=b*b%k;//底数变为原来的平方
}
else{//指数为奇数
p=p-1;
result=result*b%k;
p=p/2;
b=b*b%k;
}
}
return b1+"^"+p1+" "+"mod"+" "+k+"="+result;
}
}