同余定理的应用(处理大数
今天要不是吃鲸群里有人提问,我之前不知道还有这个定理,想想都后怕。。。果然我已经没有希望了吗?
同余定理
定义
设m是大于1的正整数,a、b是整数,如果(a-b)|m,则称a与b关于模m同余,记作a≡b(mod m),读作a与b对模m同余。
显然,有如下事实
(1)若a≡0(mod m),则a|m;
(2)a≡b(mod m)等价于a与b分别用m去除,余数相同。
证明
充分性:m|(a-b)→a≡b(mod m)。
设a=mq1+r1,b=mq2+r2,
且0≤r1,r2<m,
∵ (a-b)|m,
又a-b=m(q1-q2)+(r1-r2)。
∴必有常数n使得(r1-r2)=mn。
则有(r1-r2)|m。
∵0≤r1,r2<m,
∴0≤|r1-r2|<m,
∴r1-r2=0,
即r1=r2,故a≡b(mod m)。
必要性:a≡b(mod m)→(a-b)|m。
设a,b用m去除余数为r,
即a=mq1+r,b=mq2+r。
∵a-b=m(q1-q2),
∴(a-b)|m。
同余的性质主要有:
(1)对于同一个除数,两数的和(或差)于他们余数的和(或差)同余数。
(2)对于同一个除数,两数的乘积与他们余数的乘积同余。
(3)对于同一个除数,如果两个整数同余,那么他们的差就一定能被这个数整除。
(4)对于同一个除数,如果两个整数同余,那么他们的乘方仍然同余。解答同余类型题目的关键是灵活运用性质,把求一个比较大的数字除以某数的余数问题转化为求一个较小数除以这个数的余数,使复杂的问题变得简单化。
应用
对于加法、乘法、乘方运算,算好后取余和边算边取余是等价的
eg 1:
求2001的2003次方除以13的余数
#include<stdio.h> int pow_mod(int a,int n,int m){ /*求a^n mod m 的值 时间复杂度 O(n) */ int i,ans=1; for(i=0;i<n;i++){ ans=(int)((long long)ans*a%m); } return ans; } int main() { int a,n,m; scanf("%d%d%d",&a,&n,&m); printf("%d\n",pow_mod(a,n,m)); return 0; }