快速幂与快速乘,都运用到了一个定理:每一个正整数都能唯一表示为2的次幂的和。
即:不同的数的二进制表达形式唯一。
因此a^b 可以转化为几个a2i相乘。
又由于a2i = (a2(i - 1))2,所以可以递推求出每个a2^i。
int Pow(int a, int b, int p){
int ans = 1, base = a;
while(b){
if(b & 1)
ans = (1ll * ans * base) % p;
base = (1ll * base * base) % p;
b >>= 1;
}
return ans;
}
快速乘也是一样,把ab转化成a2^i相加。
long long Mul(long long a, long long b, long long p){
long long ans = 0, base = a;
while(b){
if(b & 1)
ans = (ans + base) % p;
base = (base << 1) % p;
b >>= 1;
}
return ans;
}
不过当数据太极限,还是用long double或者高精度吧。。。