模运算规则
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p ) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
a ^ b % p = ((a % p)^b) % p (4)
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((ab) % p * c)% p = (a * (bc) % p) % p (6)
交换律:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配律:
(a+b) % p = ( a % p + b % p ) % p (9)
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (10)
重要定理
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(11)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(12)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),
(a * c) ≡ (b * d) (%p); (13)
模幂运算
利用模运算的运算规则,我们可以使某些计算得到简化。
例如,我们想知道33335555的末位是什么。很明显不可能直接把33335555的结果计算出来,那样太大了。但我们想要确定的是3333^5555(%10),所以问题就简化了。
根据运算规则(4)a^b % p = ((a % p)^b) % p ,我们知道3333^5555(%10)= 3^5555(%10)。
根据运算规则(3) (a * b) % p = (a % p * b % p) % p ,由于5555 = 4 * 1388 + 3,我们得到35555(%10)=(3(41388) * 33)(%10)=((3(41388)(%10)* 3^3(%10))(%10)
=((3^(41388)(%10) 7)(%10)。
根据欧拉定理可以得到 3 ^ (4 * k) % 10 = 1, 所以((3^(41388)(%10) 7)(%10)= (1 * 7) (% 10) = 7
计算完毕。
利用这些规则我们可以有效地计算X^N(% P)。简单的算法是将result初始化为1,然后重复将result乘以X,每次乘法之后应用%运算符(这样使得result的值变小,以免溢出),执行N次相乘后,result就是我们要找的答案。
这样对于较小的N值来说,实现是合理的,但是当N的值很大时,需要计算很长时间,是不切实际的。下面的结论可以得到一种更好的算法。
如果N是偶数,那么X^N =(XX)1;
如果N是奇数,那么X^N = XX^(N-1) = X (XX)2;
其中[N]是指小于或等于N的最大整数。
题目:求A^B的最后三位数表示的整数(1<=A,B<=1000)
#include<stdio.h>
int p(int x,int y)
{
int i,num=1;
for(i=0;i<y;i++)
{
num*=x;
num=num%1000;
}
return num;
}
int main()
{
int x,y,n;
int date;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&x,&y);
date=p(x,y);
printf("%d\n",date);
}
return 0;
}
另外很多题都会用到取模运算
详情请点击下方链接
本文详细解析模运算的基本规则及其在复杂计算中的应用,包括加法、减法、乘法、幂运算的模运算规则,以及如何利用这些规则进行有效的大数计算,如求解大指数幂的模结果。
994

被折叠的 条评论
为什么被折叠?



