1. 程式人生 > >【模板】【數論】gcd和exgcd

【模板】【數論】gcd和exgcd

歐幾里得演算法:

歐幾里得定理:gcd(a,b)=gcd(b,amodb)

證明:

a 可以表示成 a = kb + r(a,b,k,r皆為正整數,且 r < b),則 r = a mod b
假設 d 是 a , b 的一個公約數,記作 d | a , d | b,即 a 和 b 都可以被 d 整除。
而 r = a - kb,兩邊同時除以 d,r / d = a / d - kb / d = m,由等式右邊可知m為整數,因此 d | r
因此 d 也是 b , a mod b 的公約數
假設 d 是 b , a mod b 的公約數, 則 d | b , d | (a - k * b) , k 是一個整數,
進而 d | a .因此 d 也是 a , b 的公約數
因此(a , b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。

程式碼:

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

擴充套件歐幾里得演算法:

描述:

求形如ax+by=gcd(a,b)的不定方程的一組解,且保證求出的|x|+|y|最小。

程式碼

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)//遞迴邊界
    {
        x=1,y=0;
        return a;
    }
    else
    {
        exgcd(b,a%b,x,y);
        int t=x
; x=y; y=t-a/b*y; } }

證明(字寫的醜請見諒):

這裡寫圖片描述

用途:

1.解不定方程ax+by=gcd(a,b) (廢話- -||)
2.在O(logn)時間內求乘法逆元
3.求解線性同餘方程(轉化成上述的不定方程來解)

相關推薦

模板數論gcdexgcd

歐幾里得演算法: 歐幾里得定理:gcd(a,b)=gcd(b,amodb) 證明: a 可以表示成 a = kb + r(a,b,k,r皆為正整數,且 r < b),則 r = a mod b 假設 d 是 a , b 的一個公約數,記作

模板練習——AC自動機Keywords Search HDU - 2222

rpg soc key words 練習 evm cdc rmi css x床堂0jz直寐0裙brhttp://tushu.docin.com/sghp1512 6茲c苯晌62恢uk爻2http://tushu.docin.com/ipt586 gw誹喜2i4偎e2擻a

BZOJ 2038 2009國家集訓隊 小Z的襪子模板·莫隊

com 技術 bsp 高效 題解 數量 div image 概率 【題解】   1,先說說莫隊算法。     莫隊算法是用來離線處理區間問題的算法。非常易於理解和使用,且運用十分廣泛。     假設我們現在已知區間[L,R]的答案,如果我們能以較低的時間復雜度擴展得到區間

模板·並查集洛谷 P3367 模板並查集

題目:並查集 思路: 複習…… 第一次提交忘寫路徑壓縮T了…… 結論:打過再多遍的模板也要檢查一下啊…… 程式碼: #include<bits/stdc++.h> using namespa

模板·次小生成樹 The Unique MST

程式碼: #include<cstdio> #include<vector> #include<cstring> #include<algorithm>

模板·樹的重心 codevs 3639 樹的中心

題目:樹的中心 樹的重心 找到一個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹儘可能平衡。 所以dfs下就好了。 程式碼: #include<bits/stdc++.h> using names

模板·字尾陣列/sa洛谷 P3809 模板字尾排序

題目:字尾排序 程式碼: #include<bits/stdc++.h> using namespace std; #define maxn 1000000 int n,m; char a[maxn+5]; int sa[maxn+5],rk[maxn+5];

HDU1395 ZOJ1489 2^x mod n = 1暴力法+數論

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17824    Accepted Submission(s

TP5本地執行正常,線上執行某頁面出現模板檔案不存在問題的解決辦法

相信許多小夥伴和我一樣,明明在本地執行頁面一切正常,而到線上(本人是用的虛擬主機)出現瞭如下圖的問題: 其實這個問題出現的原因很簡單,就是我們開發是在windows 系統下,windows系統對大小寫不敏感,而虛擬主機Linux,區分大小寫,所以解決辦法很簡單,如下圖所示:   解決方法就

模板數論快速冪快速乘法

快速冪 快速冪取模演算法可以在O(log2b)的時間內求出abmodp的值。 運用了二進位制的思想,實質是對b進行二進位制分解。 程式碼: typedef long long LL; LL ksm(int a,int b,int p)//最好不要把函

模板NTT三模數NTT

就會 CP 可能 復數 inline gin Go algo += 之前寫過FFT的筆記. 我們知道FFT是在復數域上進行的變換. 而且經過數學家的證明, DFT是復數域上唯一滿足循環卷積性質的變換. 而我們在OI中, 經常遇到對xxxx取模的題目, 這就啟發我們可不可以在

Javaitext根據模板生成pdf(包括圖片表格)

金額 res report als fields positions 創建模板 bst open() 1、導入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。 2、新建word文檔,創建模板,將文件另存為pdf,並用Ado

數論Sumdiv(整數的唯一分解定理+約束公式+遞歸求等比)

ali 同余模公式 left 一個 c++ 出現 素數分解 code 特殊 來源:https://blog.csdn.net/lyy289065406/article/details/6648539 題目描述 Consider two natural numbers A a

C++標準庫標準模板

(轉自:https://blog.csdn.net/rl529014/article/details/51154798) C++強大的功能來源於其豐富的類庫及庫函式資源。C++標準庫的內容總共在50個標準標頭檔案中定義。 在C++開發中,要儘可能地利用標準庫完成。這樣做的直接好處包括

模板平衡樹——TreapSplay

二叉搜尋樹($BST$):一棵帶權二叉樹,滿足左子樹的權值均小於根節點的權值,右子樹的權值均大於根節點的權值。且左右子樹也分別是二叉搜尋樹。(如下) $BST$的作用:維護一個有序數列,支援插入$x$,刪除$x$,查詢排名為$x$的數,查詢$x$的排名,求$x$的前驅後繼等操作。 時間複雜度:$O(運

清點人數樹狀陣列單修字首模板

題目傳送門:http://oi.cdshishi.net:8000/problempage.php?problem_id=3860 太水了,,,比模板還水,,模板好歹要帶一個r-(l-1),這個直接查字首和,,太水了 #include<bits/stdc++.h> #defi

Spring4(三)Spring的事務管理JDBC模板的使用

Spring 的 AOP 的基於 AspectJ 註解開發 Spring 的基於AspectJ 的註解的 AOP 開發 建立專案,引入 jar 包 引入配置檔案 applicationContext.

模板數論大雜燴~

離省選已經不剩幾天了, 然而自己還是啥也不會, 所以就臨陣磨槍刷一刷板子, 萬一用上了就賺到了~~ 這一篇就寫寫數論?(希望只考到自己打的板子然而這是不可能的←_← 儘量不壓行吧, 能寫得好懂點就寫得好懂一點吧... (為了省事就全開long long了哈, 卡常題請謹慎複製...) 裡面列舉的內容可能沒啥規

模板快速數論變換ntt(long long版)

快速數論變換ntt(long long版) const LL P = 50000000001507329LL; //190734863287 * 2 ^ 18 + 1 //const int P = 1004535809LL; //479 * 2 ^ 21 + 1 //const i

模板快速數論變換ntt

轉自http://blog.csdn.net/zz_1215/article/details/40430041 快速數論變換模板: #include <iostream> #include <string.h> #include <stdio.h&g