typedeflonglong LL;
LL q_mul(LL a, LL b, LL p){//快速乘法取模
LL ans = 0;
while (b){
if(b&1LL) ans=(ans+a)%p;
//or ans=(ans+(b%2*a)%p)%p;
a = (a +a) % p;
b >>= 1;
}
return ans;
}
逆元/数论的倒数 - 对于倒数取模运算用逆元
逆元概念引入
(a + b) % p = (a%p + b%p) %p (对)
(a - b) % p = (a%p - b%p) %p (对)
(a * b) % p = (a%p * b%p) %p (对)
(a / b) % p = (a%p / b%p) %p (错)
对于除法取模不能这样,例如(100/50)%20 = 2 ≠ (100%20) / (50%20) %20 = 0
对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们是不是对这个算式就无法计算了呢?
这时就需要逆元了
a*inv(a)=1
又对于a*b=1(mod p) b不一定是a的倒数,但是如果求余,我们可以把b看作a的倒数,并称b叫做a关于p的逆元。记b=inv(a)。 前提条件a和p互质,a才有关于p的逆元
那么对于除法取模我们就好解决了。
(a / b) % p = (a * inv(a) ) % p = (a % p * inv(a) % p) % p