快速乘
这里的快速乘的思想和快速幂的差不多;
首先要了解取余公式:
(a + b)%p = (a%p + b%p)%p
例题:
三个数 a,b,p;
数据范围:
1 ≤ a,b,p ≤ 2 × 10 ^ 9
求a*b%p
如何快速求得,且数据不溢出呢?
答案很简单,和快速幂的思想一样把 b 给二进制了就ok了。
把 b 换算成多个 2 ^ i 相加。
同样的道理这里是先对多个 a * (2 ^ i)%p 进行预处理
整体依照这个公式巧妙构建代码:(a + b)%p = (a%p + b%p)%p
代码里的 a * (2 ^ i)%p相当于 公式中的b%p .
res相当公式中的 a%p
先上代码:
int qcg(int a, int b, int p)
{
int res = 0;
while (b)
{
if (b & 1)res = ((LL)res + a) % p;
a = ((LL)a + a) % p;//相当于a*2
b >>= 1;
}
return res;
}
演示一个例子:
请结合例题和代码 以及思想理解。
建议和快速幂一起消化
click me->快速幂