1.模运算笔记
模运算的常见等式如下:(知识归纳来自于灵神)
2.幂运算笔记
幂运算的实现就是实现pow(m, n)方法,题目的具体描述leetcode第50题
代码实现方式:
//代码实现参考了leetcode官方题解
class Solution {
public double myPow(double x, int n) {
long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
public double quickMul(double x, long N){
double ans = 1.0;
//初始贡献值为x
double x_contribution = x;
//在对N进行二进制拆分的同时计算答案
while(N > 0){
if(N % 2 == 1){
//如果N二进制表示的最低为1,那么需要计入贡献
ans *= x_contribution;
}
x_contribution *= x_contribution;
//舍弃二进制表示的最低位,这样我们每次只要判断最低位即可
N /= 2;
}
return ans;
}
}
3.两者的结合运用
在周赛的过程中我遇到了模运算和幂运算两者的结合,但是对于模运算的不熟悉,所以没解答出来。题目连接:双模幂运算,题目描述如下:
题目的解答如下(解答参考了灵神的解法)
class Solution {
public List<Integer> getGoodIndices(int[][] variables, int target) {
List<Integer> ans = new ArrayList<>();
for(int i = 0; i < variables.length; i++){
int[] v = variables[i];
if(pow(pow(v[0], v[1], 10), v[2], v[3]) == target){
ans.add(i);
}
}
return ans;
}
private long pow(long x, int n, int mod){
long res = 1;
for(; n > 0; n /= 2){
if(n % 2 > 0){
res = res * x % mod;
}
x = x * x % mod;
}
return res;
}
}
这里,python可以更直接的实现这个题目,因为python中的pow方法可以传入三个参数,第三个参数就是Mod的取值
class Solution:
def getGoodIndices(self, variables: List[List[int]], target: int) -> List[int]:
return [i for i, (a, b, c, m) in enumerate(variables)
if pow(pow(a, b, 10), c, m) == target]
4.总结
需要熟悉模运算和幂运算的技巧以及实现,并且要能够灵活运用。另外,强推大家看看灵神每周比赛之后的题目讲解,值得学习!