日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 1061 (扩展欧几里德算法)

發布時間:2025/3/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1061 (扩展欧几里德算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先先拋出一個例題:


???????????青蛙的約會
Time Limit: 1000MS?Memory Limit: 10000K
Total Submissions: 89761?Accepted: 16131

Description

兩只青蛙在網上相識了,它們聊得很開心,于是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,于是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特征,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝著某個方向跳下去,總能碰到對方的。但是除非這兩只青蛙在同一時間跳到同一點上,不然是永遠都不可能碰面的。為了幫助這兩只樂觀的青蛙,你被要求寫一個程序來判斷這兩只青蛙是否能夠碰面,會在什么時候碰面。
我們把這兩只青蛙分別叫做青蛙A和青蛙B,并且規定緯度線上東經0度處為原點,由東往西為正方向,單位長度1米,這樣我們就得到了一條首尾相接的數軸。設青蛙A的出發點坐標是x,青蛙B的出發點坐標是y。青蛙A一次能跳m米,青蛙B一次能跳n米,兩只青蛙跳一次所花費的時間相同。緯度線總長L米。現在要你求出它們跳了幾次以后才會碰面。

Input

輸入只包括一行5個整數x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。

Output

輸出碰面所需要的跳躍次數,如果永遠不可能碰面則輸出一行"Impossible"

Sample Input

1 2 3 4 5

Sample Output

4


涉及知識點:ext_gcd

代碼如下:

#include<stdio.h> #include<math.h> #define LL long longLL extend_gcd(LL a, LL b, LL &x, LL &y) {if(b==0){x = 1;y = 0;return a;}LL d = extend_gcd(b, a%b, x, y);LL t = x;x = y;y = t-a/b*y;return d; }int main() {LL x, y, n, m, L;LL a,b,c,d;while(~scanf("%lld%lld%lld%lld%lld", &x, &y, &m, &n, &L)){LL p,q;a=n-m, b=L, c = x-y;d = extend_gcd(a, b, p, q);if(c%d!=0) printf("Impossible\n");else{p = p*(c/d);p = (p%b + b)%b;printf("%lld\n", p);}}return 0;

注意:

ext_gcd模板求得的只是 當 ax + by = gcd(a,b)時,x 和 y 的值。 但是當ax ' + b y' = c 如果有解,則應滿足以下情況:,c能夠整除gcd(a, b),也就是c = k? *(gcd(a, b)) 其中k為整數。那么此時的 x' 就等于kx, y' 就等于 ky,即 x' = kx, ?? y = ky',對應文中代碼部分為: p = p*(c/d);。如果想求最小正整數解的話,就要加上 p = (p%b + b)%b 了。

—————————————————————————————————————————————————————————————————————————————

????????? 今天看了一下gcd算法,本來學的教材上有這個,但不知道還叫歐幾里德算法,于是又重新看了一邊,搜的時候沒想到還有新的收獲,又看到了拓展歐幾里德算法。

? 先說一下gcd吧,也叫輾轉相除法。給定兩個數 a,b , 求兩個數中的最大公約數。

?int gcd(int n, int m) // n>m
{
? if(n%m == 0)
???????? return m;
?else
?????? ?return (m, n%m);

}

思路比較簡單,兩個數(a, b,其中a>b)的最大公約數就等于其中較小數(b)和(a%b)這兩個數的最大公約數。

最小公倍數等于 兩個數的乘積除以兩個數的最大公約數。

—————————————————————————————————————————————————————————————————————————————

再說一下extend_gcd( 拓展歐幾里得算法),ext_gcd 算法由裴蜀定理中得出:

????????? 知識點:? 在數論中,裴蜀等式裴蜀定理是一個關于最大公約數(或最大公約式)的定理。裴蜀定理得名于法國數學家艾蒂安·裴蜀,說明了對任何整數、和它們的最大公約數,關于未知數和的線性丟番圖方程(稱為裴蜀等式):

有整數解時當且僅當m是d 的倍數。裴蜀等式有解時必然有無窮多個整數解,每組解、都稱為裴蜀數,可用擴展歐幾里得算法求得。

例如,12和42的最大公約數是6,則方程有解。事實上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。

特別來說,方程 有整數解當且僅當整數a和b互素。

裴蜀等式也可以用來給最大公約數定義:其實就是最小的可以寫成形式的正整數。這個定義的本質是整環中“理想”的概念。因此對于多項式整環也有相應的裴蜀定理。

?

??????????? 歷史歷史上首先證明關于整數的裴蜀定理的并不是裴蜀,而是17世紀初的法國數學家克勞德-加斯帕·巴歇·德·梅齊里亞克(Claude-Gaspard Bachet de Méziriac)。他在于1624年發表的著作《有關整數的令人快樂與愜意的問題集》(Problèmes plaisans et délectables qui se font par les nombres)第二版中給出了問題的描述和證明[1]

然而,裴蜀推廣了梅齊里亞克的結論,特別是探討了多項式中的裴蜀等式,并給出了相應的定理和證明[2]


??????? 證明過程如下:

???? 整數中的裴蜀定理

???????? 對任意兩個整數、,設是它們的最大公約數。那么關于未知數和的線性丟番圖方程(稱為裴蜀等式):

有整數解(x,y) 當且僅當m 是d 的倍數。裴蜀等式有解時必然有無窮多個解。

證明

如果 和 中有一個是0,比如,那么它們兩個的最大公約數是。這時裴蜀等式變成,它有整數解(x,y) 當且僅當m 是d 的倍數,而且有解時必然有無窮多個解,因為 可以是任何整數。定理成立。

以下設 和 都不為0。

設,下面證明中的最小正元素是 與 的最大公約數。

首先, 不是空集(至少包含 和),因此由于自然數集合是良序的, 中存在最小正元素。考慮A中任意一個正元素p()對 的帶余除法:設,其中q 為正整數,。但是

因此 ,。也就是說,A中任意一個正元素p都是 的倍數,特別地:、。因此 是 和 的公約數。

另一方面,對 和 的任意正公約數,設、,那么

因此 。所以 是 和 的最大公約數。

在方程中,如果,那么方程顯然有無窮多個解:

相反的,如果有整數解,那么,于是由前可知(即)。

m=1時,方程有解當且僅當a、b互質。方程有解時,解的集合是

。其中是方程的一個解,可由輾轉相除法得到。

所有解中,有且僅有一個解(x,y) 滿足,。


拓展歐幾里德算法:見鏈接? http://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95

轉載于:https://www.cnblogs.com/6bing/p/3931241.html

總結

以上是生活随笔為你收集整理的poj 1061 (扩展欧几里德算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。