垃圾lulu的博客
大数乘积取模的原理
大数乘取余:
由于p同样很大,导致((a%p)*(b%p))%p还是会溢出。
举个例子4 * (13)%p;
我们把13转化为二进制数即1101
即有4 * (1101)(2)%p;
即转化为4 *(1 *2^3 + 1 *2^2+0 *2^1+1 *2^0)%p;
那么问题就转化为4从1101的低位开始不断相乘取模
我们只需要每移动一位时将4乘以2即可,当b的最后一位为1时相加
实现代码如下
// An highlighted block
#include<iostream>
using namespace std;
typedef long long ll;
ll mod_mult(ll a, ll b, ll mod)
{
a %=