1. 程式人生 > >同餘定理的應用(處理大數

同餘定理的應用(處理大數

       今天要不是吃鯨群裡有人提問,我之前不知道還有這個定理,想想都後怕。。。果然我已經沒有希望了嗎?

同餘定理

定義

設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=mq 1+r 1,b=mq 2
+r 2, 且0≤r 1,r 2<m, ∵ (a-b)|m, 又a-b=m(q 1-q 2)+(r 1-r 2)。 ∴必有常數n使得(r 1-r 2)=mn。 則有(r 1-r 2)|m。 ∵0≤r 1,r 2<m, ∴0≤|r 1-r 2|<m, ∴r 1-r 2=0, 即r 1=r 2,故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; }