【数论】四则运算的取模处理

一、前言

在日常的算法题学习中,我们有时会遇到一些题目中所需要处理的数据比较大。由于计算机的特点,我们直接处理这些大数据是会出问题的,为了避免出现这样的问题,题目中往往需要对计算中的数据或者结果取模处理,但是我们往往不能等到所有的计算结束后再取模处理,因为这样数据往往已经超出规定的范围了。因此,我们在进行运算的时候就要同时进行取模处理,在本篇博客中,会简单介绍一下四则运算的取模处理,但是限制与篇幅问题,本博客只会直接介绍处理方法,对于原理则不做证明。

二、加法运算取模

加法取模的处理是比较简单的。
(A + B) % mod = ((A % mod) + (B % mod)) % mod

三、乘法运算取模

乘法取模运算取模的操作方法与加法运算类似
(A * B) % mod = ((A % mod) * (B % mod)) % mod

四、减法运算取模

减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
(A - B) % mod =((A % mod) - (B % mod) +mod) % mod

五、除法运算取模

除法运算取模是不是也和上面的取模运算一样是
(A / B) % mod = ((A % mod) / (B % mod)) % mod呢?
答案是否定的,随便代入几个数进去验证一下就会发现上面的公式不成立。

对于除法取模而言,我们必须要求出对于除数B关于mod的逆元inv(B),然后得到除法取模公式
(A / B) % mod = ((A % mod) * (inv(B) % mod)) % mod
在这里,B的逆元 inv(B)=Bmod-2,在这里对公式的证明省略(费马小定理)
代码如下,需要时可以直接使用

const int mod = 1e9 + 7;
int quickpow(int a, int b)  //快速幂求a^b%mod
{
  if (b < 0)
    return 0;
  int ret = 1;
  a %= mod;
  while (b)
  {
    if (b & 1)
      ret = (ret * a) % mod;
    b >>= 1;
    a = (a * a) % mod;
  }
  return ret;
}
int inv(int a)
{
  return quickpow(a, mod - 2);
}

作者:Avalon·Demerzel

上一篇:[题解]智乃买瓜


下一篇:随机输入10个数,然后从中找出第一大数和第二大数