快速幂
原理:把超多次乘法转换为少次乘法
比如求2的8次方,你可以看成8个2相乘,同时也可以看成4个4相乘,还可以看成是2个16相乘。
可以看到,通过递归,不断地将相乘的数扩大,而这个不断地将相乘的数变大的过程,也正是快速幂的精髓。
//将无符号长整型定义为ll
typedef unsigned long long ll;
ll Power(ll a, ll b)
{
ll res = 1; //初始化结果为1
while(b)//当指数不为0时继续计算
{
if(b&1) { res *= a; }//不恰好可以让指数÷2,就先乘个a
//将底数a扩大,指数b减半
a *= a;
b>>= 1;
}
return res;
}
快速模幂
原理:数学运算将mod提取入底数,加快运算速度(?)
104 mod6可以转变为(102+102)mod6,可以变化为(102mod6)(102mod6),同样的操作最后就变为(10mod6)4mod6(一边次方一边模)
typedef unsigned long long ll;
ll Power(ll a, ll b, ll mod)
{
//函数多传入一个要模除的数mod
ll res = 1;
while(b)
{
if(b&1){
res *= a;
res %= mod;
}
a *= a;
a %= mod;
b>>= 1;
}
return res;
}