奇怪的輾轉相除法

2021-08-10 00:03:07 字數 808 閱讀 4522

剛剛在網上翻到一套oi題,搞了下來,不過題幹好像被人和諧了一部分,反正只能做,剩下的就不知道了。

第一題大意是:有數對(a,b),可以對其進行操作,讓它變為(a+b,b)或(a,a+b),初始數對為(1,1),給定乙個數p,問最少幾次操作就能變出p來。

當時我上場先打bfs,然後迴圈佇列爆了,好像只有30%的分數,然後轉而去做其他的題目,最後回來一想,反而找到了一些思路:

首先,如果數對中有乙個數不是p,另乙個數超過p,那就沒有可能出p了,然而這是個剪枝······;

然後我們繼續考慮,對於數對(p,m),一定有p>m,這時因為如果p

同時,我們還發現能夠從乙個數對推知它的上乙個狀態,設a>b,(a,b)->(b,a-b)

哦?這不是那什麼「更相減損之術」,(就是輾轉相除法233),

然後我們就得到了規律,有乙個數對(a,b),如果a%b=0,並且都不是一,那麼這個數對是不可能由(1,1)變來的(因為最大公約數不是一)

而乙個數對(a,b)可以由(b,a%b)變來,次數是a/b(更相損減嘛),

然後進入思路的正道,正難則反,如果說我們知道(p,m)中的m,也就知道了這個數對的變化次數,

然後又已知m

a掉了。

#include#include#include#include#includeusing namespace std;

int n;

int ans;

int solve(int a,int b)

int main()

for(int i=1;i

覺得這是一道有意思的題目。

輾轉相除法原理

輾轉相除法原理 假設有兩個數x和y,存在乙個最大公約數z x,y 即x和y都有公因數z,那麼x一定能被z整除,y也一定能被z整除,所以x和y的線性組合mx ny也一定能被z整除。m和n可取任意整數 對於輾轉相除法來說,思路就是 若x y,設x y n餘c,則x能表示成x ny c的形式,將ny移到左...

約分 輾轉相除法

include using namespace std int main int temp1 int temp2 cin temp1 temp2 int a temp1 int b temp2 while b 0 int temp a b a b b temp cout 輾轉相除法 輾轉相除法是求兩...

模板 輾轉相除法

處理最大公因數時十分好用 但是我證不出來。gcd a,b gcd b,a mod b b 0 設兩數為a b a b 用gcd a,b 表示a,b的最大公約數,r a mod b 為a除以b的餘數,k為a除以b的商,即a b kr。輾轉相除法即是要證明gcd a,b gcd b,r 第一步 令c g...