定義:• 所謂的同餘,顧名思義,就是許多的數被乙個數d去除,有相同的餘數。d數學上的稱謂為模。如a=6,b=1,d=5,則我們說a和b是模d同餘的。因為他們都有相同的餘數1。
• 數學上的記法為:
• a≡ b(mod d)
• 可以看出當n• (1) a和b是模d同餘的.
• (2) 存在某個整數n,使得a=b+nd .
• (3) d整除a-b.
• 可以通過換算得出上面三個說話都是正確而且是等價的.
定律:• 同餘公式也有許多我們常見的定律,比如相等律,結合律,交換律,傳遞律….如下面的表示:
• 1)a≡a(modd)
• 2)a≡b(modd)→b≡a(mod d)
• 3)(a≡b(modd),b≡c(mod d))→a≡c(mod d)
• 如果a≡x(modd),b≡m(mod d),則
• 4)a+b≡x+m (mod d)
• 5)a-b≡x-m(mod d)
• 6)a*b≡x*m(mod d )
應用:• (a+b)%c=(a%c+b%c)%c;
• (a*b)%c=(a%c*b%c)%c;
• 對於大數的求餘,聯想到進製轉換時的方法,得到
• 舉例如下,設大數 m=1234,模n
• 就等於((((1*10)%n+2%n)%n*10%n+3%n)%n*10%n+4%n)%n
大數求餘的簡單模板:
• #include//大數求餘,其中n(除數)不是大數
char a[1000];
int main()
int i,j,k,m,n;
return 0;
} poj2635
•題目描述:
• 給定乙個大數k,k是兩個大素數的乘積的值。(4<= k <= 10^100 )
• 再給定乙個int內的數l (2 <=l <= 10^6 )
• 問這兩個大素數中最小的乙個是否小於l,如果小於則輸出這個素數。
解題思路:
• 1、 char格式讀入k。把k轉成千進製kt,同時變為int型。
• 把數字往大進製轉換能夠加快運算效率。若用十進位制則耗費很多時間,會tle。
• 千進製的性質與十進位制相似。
• 2、 高精度求模。
• 主要利用kt陣列和同餘模定理。
• 例如要驗證123是否被3整除,只需求模123%3
• 但當123是乙個大數時,就不能直接求,只能通過同餘模定理對大數「分塊」間接求模
• (a+b)%c=(a%c+b%c)%c;
• (a*b)%c=(a%c*b%c)%c;
• 具體做法是:
• 先求1%3 = 1
• 再求(1*10+2)%3 = 0
• 再求 (0*10+3)% 3 = 1
• 那麼就間接得到123%3=0,這是顯然正確的
• 而且不難發現, (1*10+2)*10+3 = 123
• 這是在10進製下的做法,千進製也同理,*10改為*1000就可以了
同餘模定理
原文 同餘模定理 定義 所謂的同餘,顧名思義,就是許多的數被乙個數 d 去除,有相同的餘數。d 數學上的稱謂為模。如 a 6,b 1,d 5,則我們說 a 和 b 是模 d 同餘的。因為他們都有相同的餘數 1 數學上的記法為 a b mod d 可以看出當 n d 的時候,所有的 n 都對 d 同商...
ACM同餘模定理(模版)
今天將同餘模定理重新好好看了一下。同餘模定理 所謂的同餘,顧名思義,就是許多的數被乙個數d去除,有相同的餘數。d數學上的稱謂為模。如a 6,b 1,d 5,則我們說a和b是模d同餘的。因為他們都有相同的餘數1。有很多定理,但是我們只需要用到兩個,其餘的太過簡單就不再敘述。應用 a b c a c b...
同餘模定理的應用
一 公式 同餘模定理 a b mod a mod b mod mod a b mod a mod b mod mod 二 應用 求s description s n n 5 求s n 除以3的餘數 input 每行輸入乙個整數n,0 n 1000000 注意n的範圍,int long long in...