1. 程式人生 > >對於拓展歐幾里德演算法的理解

對於拓展歐幾里德演算法的理解

上面的思想是以遞迴定義的,因為 gcd 不斷的遞迴求解一定會有個時候 b=0,所以遞迴可以結束。

對於上述說明,可以給道題目幫助理解:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10755

先說一下大概題意:有兩隻青蛙,一隻在座標x,另一直在座標y,青蛙x一次跳躍可以前進m單位距離,青蛙y一次跳躍可以前進n單位的距離,兩青蛙都在同一緯度,該緯度長度為L。兩隻青蛙同方向同時跳啊跳,問你最少跳多少次,它們才可以相遇,如果不能相遇,輸出impossble

分析一下:假設跳了T次以後,青蛙1的座標是x+m*T,青蛙2的座標是y+n*T.他們能相遇的情況是(x+m*T)-(y+n*T)==P*L,其中P為某一個整數,變形一下

得到(n-m)*T+P*L==x-y   我們設a=(n-m),b=L,c=x-y,T=x,P=y.於是便得到ax+by==c。激動啊,這不就是上面一樣的式子嗎~

直接套用擴充套件歐幾里得函式,得到一組解x,y。由於問題是問最少跳多少次,於是只有x是我們需要的資訊。那麼再想,x是最小的嗎?

答案是可能不是!那麼如何得到最小解呢?  我們考慮x的所有解的式子: x=x0+b/d*t。x0是我們剛剛求到的,很顯然右邊是有個單調函式,當t為某一個與x正負性質相反的數時,可以得到最小的x。 令x的正負性質為正,那麼x=x0-b/d*t1 (t1==-t)。令x==0,那麼t=x0*d/b,最小的x等於x0減去t*b/d。這裡得到的x可能是負數,如果是負數,我們再為它加上一個b/d即是所求答案了!


類似的題目還有poj2142,poj2891.

相關推薦

對於拓展演算法理解

上面的思想是以遞迴定義的,因為 gcd 不斷的遞迴求解一定會有個時候 b=0,所以遞迴可以結束。 對於上述說明,可以給道題目幫助理解: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10755先說一下大概題意:有兩隻青蛙,一隻在座標x,

拓展演算法的求解證明及基本應用

拓展歐幾里德要解決的問題就是給定方程 a x +

拓展演算法模板

程式碼示例:求出ax + by = c的所有解 #include<cstdio> int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1,y = 0; return a; } int d = e

同餘方程(擴充套件演算法

同餘方程 時間限制: 1 Sec  記憶體限制: 128 MB 題目描述 求關於 x 的同餘方程 ax ≡ 1 (mod b)的最小正整數解。 輸入 輸入只有一行,包含兩個正整數 a, b,用一個空格隔開。 輸出 輸出只有一行,包含

Luogu4433:[COCI2009-2010#1] ALADIN(類演算法)

先套用一個線段樹維護離散化之後的區間的每一段的答案 那麼只要考慮怎麼下面的東西即可 ∑

caioj 1153 擴充套件演算法(解不定方程)

模板題 注意exgcd函式要稍微記一下 #include<cstdio> #include<cctype> #include<algorithm> #define

擴充套件的演算法-HDU2669

The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the Trees  Trees are Shaking, Leaves are Fal

【數論】拓展演算法

寫在前面   這篇部落格是我在【數論】對 算術基本定理 的研究 中的一部分 拓展歐幾里得演算法    現在已經有了a-b == GCD(a,b) * (n1-n2),那就可以再來個直接點的   GCD(a,b) + (p*n1+q*n2) == GCD(a,b) 此處放

【數論】拓展演算法的多解

寫在前面   這篇部落格是我在【數論】對 算術基本定理 的研究 中的一部分 拓展歐幾里得演算法的多解   拓展歐幾里得演算法 擴充套件歐幾里德演算法是用來在已知a, b求解一組p,q,使它們滿足貝祖等式: pa+qb = gcd(a, b) =d ——bi

poj 1061 青蛙的約會​​​​​​​(拓展演算法

【題目】 【題意】 兩隻青蛙在給定長度的數軸上運動,給定初始位置和跳躍每次的長度,問在什麼時候兩隻青蛙能相遇。 【思路】 根據題意有x+mt=y+nt+kl,t表示跳躍次數。變化一下得到式子

利用拓展演算法解決特定方程求解問題

在給定正整數a,b的情況下求解ax+by=c (其中c為a,b的最大公約數,或者最大公約數的倍數,x,y為整數)求出對應x,y,可以採取矩陣去將一次次迴圈簡化成一次次矩陣相乘,從而可以在求餘的同時求出x,y` i = input(‘輸入數字a’); j = in

兩個數的生成範圍(兩個生成元)(拓展演算法

最近遇到一個題,就是給兩個數,這兩個數有無限個,問你由這些數能得到哪些數。 還可以擴充套件成有n個數,問你能得到哪些數 這裡其實是有一個結論的,就是: ①兩個數互質,就可以生成很多很多數,而且從某個數開始就是連續的 ②兩個數不互質,生成的數一定是gcd(a,b)的

數論-擴充套件演算法

找出一對整數(x,y),使得ax+by=gcd(a,b)。注意,這裡的x和y不一定是正數,也可能是負數或者0.例如,gcd(6,15)=3,6*3-15*1=3,其中,x=3,y=-1.這個方程還有其他解,如x=-2,y=1。 用數學歸納法並不難證明演算法的正確性。此處略去

拓展演算法

我們從17x + 5y = 1方程出發—— 歐幾里得演算法拓展:人們發現形如A * x + B * y = gcd(A, B) = gcd(B, A%B) (歐幾里得演算法得知)的方程,都是一定有解的。 我們做以下方程變換(程式碼原理): // ∵A = A %

求解組合數取模---拓展和費馬小定理求解逆元

組合數:C(n, m) ;         組合數取模:C(n, m) % mod,mod是一個很大的數。1.公式:2.性質:(1)C(n,m)= C(n,n-m)   其中有C(n, 0) = 1;(2)C(n,m)=C(n-1,m-1)+C(n-1,m)。可以用作遞迴中的

演算法學習(一)——演算法&擴充套件演算法

最大公約數/歐幾里德演算法(gcd) 歐幾里德演算法又稱輾轉相除法,證明可以度娘。 個人簡單腦部就是a和b兩個數的模還是a和b的最大公約數 int型別  int gcd(int a, int b) {return a%b==0?b:gcd(b,a%b);} long l

擴充套件演算法求解線性同餘方程

 歐幾里德演算法  歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。其計算原理依賴於下面的定理:  定理:gcd(a,b) = gcd(b,a mod b)  證明:a可以表示成a = kb + r,則r = a mod b  假設d是a,b的一個公約數,則

演算法的推導與證明 || 擴充套件演算法的解釋說明

序言:      當博主第一次見到歐幾里德演算法時,我是不屑一顧的,由於模板比較好背,所以也沒有仔細研究過其中的數學原理.這段時間突然喜歡上了數學,碰巧同學講了一下基礎數論,就去聽了一聽. 由於博主數學基礎和學習能力都比較差,沒有立即消化其中的知識,於是研究

擴充套件演算法 遞迴和非遞迴實現及證明

關於歐幾里得演算法,貝祖等式,擴充套件歐幾里得演算法,Wikipedia的解釋非常非常詳細了。 另外,看了好多別人優秀的總結,我認為最詳盡的就是ACM之家的總結。 這裡自己再總結一次…實際上就是把別人總結的,我認為有助於自己理解的內容copy過來,再加上