Yourtask is to calculate ab mod 1337 where a is a positive integer and b isan extremely large positive integer given in the form of an array.
Example1:
a = 2
b = [3]
Result: 8
Example2:
a = 2
b = [1,0]
Result: 1024
这一题给你一个a和b,问你a^b%1337的值是多少,值得一提的是这里的b可以是任意大的数
我的思路是,由于(a*a)%m=k1,也就是a^(2^1)=k1,
可知,设b=a*a,那么(b*b)%m=(k1*k1)%m,也就是a^(2^2)%m=(k*k)%m=k2,
同样可知,设c=b*b=a^4,那么(c*c)%m=a^(2^3)%m=(k2*k2)%m=k3,
。。。。
(p*p)%m=a^(2^n)%m=(kn-1*kn-1)%m=kn,,
这里需要求a^(b),那么我们可以将b化为2^n1+2^n2…(就是将b转换成2进制),那么a^(b)%m=(a^(2^n1)%m* a^(2^n2)%m…)%m
而a^(2^nn)%m的值可以由上面的递推公式计算出来
class Solution {
public:
int dividTwo(vector<int> & num,int & numI)
{
if (numI == num.size()) return -1;
int tmp=0;
for (int i = numI; i < num.size(); i++)
{
tmp = tmp * 10 + num[i];
num[i] = tmp / 2;
tmp = tmp % 2;
}
if (num[numI] == 0) numI++;
return tmp;
}
int superPow(int a, vector<int>& b) {
int result = 1; int bI = 0;
int k=a%1337;
int tmp = dividTwo(b,bI);
while (tmp != -1)
{
if (tmp != 0) result = (result * k) % 1337;
k = (k*k) % 1337;
tmp = dividTwo(b,bI);
}
return result;
}
};