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

一、前言

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

二、加法运算取模

加法取模的处理是比较简单的。
(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值