一、取模运算
定义
Define1:
性质
-
(a+b)%m = (a%m + b%m)%m -
(a-b)%m = (a%m - b%m)%m -
(a * b)%m = (a%m * b%m)%m -
除法时不成立
示例:(4 * 8)% 3 == (4%3 + 8%3)%3 == (1+2)%3 == 0
二、快速幂
1.计算 A^N
如果简单循环乘,O(n)会TLE。
如何高效计算呢?O(log n)
思路
可将A^N分解为若干个A的幂相乘,运算过程如下:
// n>>=1 表示将n表示的二进制数整体向右移动一bit
// n&1 表示n最后一位的数字;
时间复杂度:O(log n)
代码如下(示例):
typedef long long LL;
LL quickPow(LL a,LL n)//calculate a^n
{
LL base = a;
LL result = 1LL;
while(n)
{
if(n&1)
{
result *= base;
}
base *= base;
n >>= 1;
}
return result;
}
2.快速乘法
基于ab%c=(a%c)b%c的算法
代码如下(示例):
LL quickMul(LL a,LL b,LL c) //a*n%p
{
LL ans = 1;
int base = a%c;
while(b)
{
if(b&1)
{
ans = (ans*base)%c;
}
base = (base*base)%c;
b >>= 1;
}
return ans;
}