import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long a , b , p ;
Scanner scanner = new Scanner(System.in);
a = scanner .nextInt();
b = scanner. nextInt();
p = scanner . nextInt();
//使用位运算来进行操作
//计算a^b % p
long res = 1 %p ;
while(b!= 0 ){
if((b&1) != 0 ){//判断在最后一位是不是0
res = res*a % p ;
}
a = a * a %p;
b = b>>1 ;
}
System.out.println(res );
}
}
import java.util.Scanner;
public class BaiDu {
public static void main(String[] args) {
long a , b , p ;
Scanner scanner = new Scanner(System.in);
a = scanner .nextLong();
b = scanner. nextLong();
p = scanner . nextLong();
long res = 0 ;
while(b != 0 ){
if((b&1) != 0 ){
res = (res + a ) %p;
}
a = (a + a )%p;
b>>=1;
}
System.out.println(res);
}
}
我们来看一下这个位运算到底是什么意思?
关键代码:
while(b != 0 ){
if((b&1) != 0 ){
res = (res + a ) %p;
}
a = (a + a )%p;
b>>=1;
}
啥意思呢?
我们看如果求 a * b 换作二进制如何求呢?
首先我们需要求的是b个a进行相加对不对
那么b& 1是什么意思呢,&运算代表的是二进制的计算,计算的是b作为二进制数的最后一位看看是否为 0 ,我们这样做的目的是什么呢?
比如我们计算3* 5
我们如何以二进制计算?
a= 3
b =5 ;二进制为 101
35 = 3(101二进制)
= 3* 2 2 + 3*20 + 3 * 21
我们这个算法的主要目的在于哪里呢?
比如我们计算
24我们先计算21,22,然后直接以22为基石,直接计算24也就是我们省略了计算23直接利用了上一步的答案得到结果
位运算每次都是以2 为单位进行乘除的减少了我们的计算量,相当于我们0–n 从前O(n) 现在O(logN)