文章目录
- 概念
概念
俄罗斯农民乘法经常被用于两数相乘取模的场景,如果两数相乘已经超过数据范围,但取模后不会超过,我们就可以利用这个方法来拆位取模计算贡献,保证每次运算都在数据范围内。
A
和 B
两数相乘的时候我们如何利用加法和位运算来模拟?
将 B
二进制展开,如果 B
的二进制表示下第 i
位为 1
,那么这一位对最后结果的贡献就是 A∗(1<<i)
,即 A<<i
。我们遍历 B
二进制展开下的每一位,将所有贡献累加起来就是最后的答案。
算法实现:
int quickMulti(int A, int B) {int ans = 0;for ( ; B; B >>= 1) {if (B & 1) {ans += A;}A <<= 1;}return ans;
}