LeetCode 1922题解(快速幂模板题)
这就是快速幂的计算方式,将一个幂次方计算公式拆分后计算
这一题就是典型的快速幂的模板题,前几天因为写题遇到了知识盲区所以弄了很久,昨天的困难题也没做出来,只有自己的计算思路,实现还跑不出来,气死我了,今天也刚刚学会了快速幂
对于本题我们可以对答案进行拆分,分为两部分,一个计算偶数下标的幂次方,一个计算奇数下标的幂次方
偶数有0,2,4,6,8;一共5个
质数有2,3,5,7;一共4个
所以偶数下标计算5的幂次方
奇数计算4的幂次方
位数由n决定
而位数n对应的偶数下标个数为(n+1)/2
奇数小标个数为n/2
而遍历的幂次方根据二进制的位运算进行遍历拆分幂次方计算(n&1)>0
,只有1和0两种情况
class Solution {
private static final int MOD = 10_0000_0007;
public int countGoodNumbers(long n) {
return (int)(pow(5,(n+1) / 2)*pow(4,n / 2) % MOD);
}
public long pow(long x,long n){
long res = 1;
while(n>0){
if((n&1)>0){
res = res*x%MOD;
}
x = x*x%MOD;
n = n>>1;
}
return res;
}
}