前言
在很多的编程竞赛中,题目的结果或者数据都会过于庞大,以至于就算是使用long long型也无法储存,所以很多的题就往往会要求我们去输出取模的结果,这时候我们就用到取模运算。
取模跟取余是几乎同一个意思的东西,都是“%”,我们可以叫他取模,也可以叫他取余。
取模和取余唯一的区别就是在求商时,取模向负无穷方向舍入,而取余向0方向舍入。
一,取模运算(加,减,乘以及指数)
(a + b)%M = (a%M + b%M)%M //加法取模运算
(a - b)%M = (a%M - b%M + M )%M (a%M - B%M 后的值一定小于M) //减法取模运算
(a * b)%M = (a%M)*(b%M)%M。 // 乘法取模运算
很多的除法取模都会用到求逆元的知识,这篇博客就不具体介绍了
a^b%p = (a%p)^(φ( p ) + b%φ( p )) %p(降幂公式) //指数取模运算,这里用到了欧拉定理的延伸
二,负数取模
9%10=1
这里列出一个两个正整数取模的例子,可以与下面的负数取模进行对比
我们分两种情况:
①一正数一负数取模:
-9%10 = 1 ⇐ ⇒ (-9 + 10)%10
11%(-10) = -9 ⇐ ⇒ (11 - 20)%(-10)
9%(-10) = -1 ⇐ ⇒ (9 - 10)%(-10)
11%(-10) = -9 ⇐ ⇒ (11 - 20)%(-10)
②两个负数取模:
(-9)%(-10) = -9 ⇐ ⇒ 9%10
(-11)%(-10) = -1 ⇐ ⇒ 11%10
总结
取模运算是一个用来缩小数据的大小的很常用的手段,例如快速幂、快速乘等都需要用到取模运算来解决爆精度问题(数据溢出)。不难,但是很重要,所以需要很扎实的掌握他的运算法则。