1、题目描述
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
提示:
- 1 <= a <= 231 - 1
- 1 <= b.length <= 2000
- 0 <= b[i] <= 9
- b 不含前导 0
2、示例
输入:a = 2147483647, b = [2,0,0]
输出:1198
3、题解
基本思想:快速幂算法+取模运算性质:a^b%p=((a%p)^b)%p
快速幂算法,将n看成二进制数,比如n为11,3^11=3^1011=3^1000*3^10*3^1,也就是从低位往高位不断循环右移一位且当前x值为x*=x,最低位遇到1也就是当前为奇数res乘当前x即res*=x。
#include<vector>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
class Solution {
public:
int superPow(int a, vector<int>& b) {
//基本思想:快速幂算法+取模运算性质
//a^b%p=((a%p)^b)%p
int res=1;
a=a%1337;
for(int i=int(b.size())-1;i>=0;i--)
{
res=res*myPow(a,b[i])%1337;
a=myPow(a,10)%1337;
}
return res;
}
int myPow(int a,int n)
{
int res=1;
while(n>0)
{
if(n%2==1)
res=res*a%1337;
n>>=1;
a=a*a%1337;
}
return res;
}
};
int main()
{
int a=2147483647;
vector<int> b={2,0,0};
Solution solute;
cout<<solute.superPow(a,b)<<endl;
return 0;
}