1. 程式人生 > >同餘定理及應用

同餘定理及應用

    同餘定理兩個整數同時除以一個整數得到的餘數相同,則二整數同餘。記作a ≡ b(mod m)。

1. 同餘定理的加法乘法應用

  • (a + b) % m = (a % m + b % m) % m
設 a = k1 * m + r1,b = k2 * m + r2
則 (a + b) % m = ((k1 * m + r1) + (k2 * m + r2)) % m
               = ((k1 + k2) * m + (r1 + r2)) % m
               = (r1 + r2) % m
               = (a % m + b % m) % m
所以 (a + b) % m = (a % m + b % m) % m
  • (a * b) % m = ((a % m) * (b % m)) % m
設 a = k1 * m + r1,b = k2 * m + r2
則 (a * b) % m = ((k1 * m + r1) * (k2 * m + r2)) % m
               = (k1 * k2 * m^2 + (k1 * r2 + k2 * r1) * m + r1 * r2) % m
               = (r1 * r2) % m
               = ((a % m) * (b % m)) % m
所以 (a * b) % m = ((a % m) * (b % m)) % m

2. 高精度取模

  • 高精度對單精度取模

    一個高精度數對一個數取餘,可以把高精度數看成各位數的權值與個位數乘積的和。

    比如1234 = ((1 * 10 + 2) * 10 + 3) * 10 + 4,對這個數進行取餘運算就是上面基本加和乘的應用。

#include<iostream>
#include<string>
using namespace std;

int main(){
    string a;
    int b;
    cin >> a >> b;
    int len = a.length();
    int ans = 0;
    for(int i = 0; i < len; i++){
        ans = (ans * 10 + a[i] - '0') % b;
    }
    cout << ans << endl;
    return 0;
}
  • 快速冪取模

    將冪拆解為多個底數的平方次的積,如果指數為偶數,把指數除以2,並讓底數的平方次取餘,如果指數為奇數,就把多出來的底數記錄下來,再執行偶數次的操作。

#include<iostream>
using namespace std;

int PowerMod(int a, int b, int c){
    int ans = 1;
    a = a % c;
    while(b > 0){
        if(b&1){
            ans *= (a % c);
        }
        b >>= 1;
        a = (a * a) % c;
    }
    ans %= c;
    return ans;
}

int main(){
    int a, b, c;
    cin >> a >> b >> c;
    cout << PowerMod(a, b, c) << endl;
    return 0;
}

相關推薦

定理應用

    同餘定理:兩個整數同時除以一個整數得到的餘數相同,則二整數同餘。記作a ≡ b(mod m)。1. 同餘定理的加法乘法應用(a + b) % m = (a % m + b % m) % m設 a = k1 * m + r1,b = k2 * m + r2 則 (a +

定理應用(處理大數

       今天要不是吃鯨群裡有人提問,我之前不知道還有這個定理,想想都後怕。。。果然我已經沒有希望了嗎? 同餘定理 定義 設m是大於1的正整數,a、b是整數,如果(a-b)|m,則稱a與b關於模m同餘,記作a≡b(mod m),讀作a與b對模m同

學習歷程-定理兩大基本應用

int fun(int a,int b) { int base=a,sum=1;//base為3的1次方 3的2次方 3的4次方 。。。。。 while(b!=0) { if(b&1!=0) //此處判斷該位為不為1 { sum=sum*base; sum%=10;

定理在程式設計中的應用

推論:對於加法、乘法、乘方運算,算好後取餘和邊算邊取餘是等價的 以加法為例: (a+b+c+...d)%m 將a,b,c..,d分解成z1*m+k1 , z2*m+k2 , z3*m+k3.....

Lucas定理應用

應該 .com mda 什麽 範圍 這一 CA 你會 nbsp 額,前兩天剛講了數據結構,今天我來講講組合數學中的一種奇妙優化——Lucas 先看這樣一個東西 沒學過lucas的肯定會說:還不簡單?處理逆元,邊乘邊膜唄 是,可以,但註意一

定理(歐幾里得演算法)

如果  (a-b)%m==0  那麼 a%m==0  b%m==0 a,b關於模m同餘。   求最大公約數 #include "pch.h" #include<iostream> #include<cstdio> #include<

hdu1163 Eddy's digital Roots(合九法+定理)

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 84156&nbs

A - Find a Number CodeForces - 1070A -記憶化廣搜-定理

A - Find a Number  CodeForces - 1070A  題意: 思路:與數位dp思想有點相似,數太大無法儲存,選擇保留其對搜尋目標有用的資訊,並且記憶化減少無效多餘搜尋, vis[i][j]兩位含義是 當前的 餘數為i,各個

POJ 1995 Raising Modulo Numbers 【快速冪+定理

People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows

迭代取中法、乘混合法產生隨機數方法

0.399000 0.920100 0.658400 0.349000 0.180100 0.243600 0.934000 0.235600 0.550700 0.327000 0.692900 0.011000 0.012100 0.014600 0.021300 0.045300 0.205200 0.

CodeForces 17D Notepad(定理)

D. Notepad time limit per test 2 seconds memory limit per test 64 megabytes input standa

poj2635 定理 + 素數篩法

      題意:給定一個數,這個數是兩個素數的乘積,並給定一個限制L,問是否兩個素數中存在小於L的數,若存在輸出較小質數,否則列印‘GOOD’。     思路: 1 . x = a * b, a和

定理+逆元】知識點講解

【同餘的定義】: 【同餘的主要性質】: 性質證明: 【逆元】 (1)定義: 【費馬小引理求解逆元】: 程式碼實現: long long quickpow(long long a,long long b){ if(b<0) retur

hdu1212(定理

同餘定理:(a+b)%c = (a%c + b % c) % c,(a*b)%c = (a%c * b%c) % c 例如:353%3 = (300 % 3 + 50 % 3 + 3 % 3) % 3 = 2 貼出程式碼: #include <iostream

4704(費馬小定理定理 ,求超高次冪)

Input 2 Output 2 Hint 1. For N = 2, S(1) = S(2) = 1.2. The input file consists of multiple test cases. Sample Input

ACM暑期集訓 定理+逆元 大數取

表面上看這道題是問a能不能整除b,實際上還是看二者取余余數是否為0,屬於大數取餘的範圍 a的範圍達到10的200次方,用 long long都已經不可以,需要用字串,而b可以用long long 題目: F - Large Division Given two i

【練習賽補題】poj1426 【定理】【有趣~】

Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33882 Accepted: 14173 Special Judge Description

算術基本定理應用串講尤拉函式

主要有以下內容: 1. 質因子分解 2. 質因子個數 3. 求數N的所有因子之和 4. 算術基本定理角度看GCD和LCM 程式碼實現: 質因數分解,個數統計,求和 #include <cstdio> #include &l

hdu 2099 數論-定理

題目意思是一個整數n 知道十位以前的數字a 十位和個位不曉得 這個整數能夠被某個數b整除 給你a和b 讓你求十位和個位數的所有可能結果 很顯然是同餘定理 公式為:a = b + c;  a % d = ( b % d + c % d) %d; 從0到99枚舉出所有結果

數數 (數學)(快速冪+定理

數數 【問題描述】 小 Star 還不會數數。有一天他看到了一張奇怪的數表,上面的每一個數各自都由相同數字構成,比如“11111111”“66666” 。於是他想自己從 1 慢慢數到這個數字。多少 Star 有個很不好的習慣,每數到一定個數就會從頭開始數