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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扩展欧几里得算法之双六问题

發(fā)布時(shí)間:2025/3/19 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扩展欧几里得算法之双六问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

雙六

一個(gè)雙六上面向前向后無限延續(xù)的格子,每個(gè)格子都寫有整數(shù),其中0號格子是起點(diǎn)。1號格子是終點(diǎn)。而骰子上只有a,b,-a,-b四個(gè)整數(shù),所以根據(jù)a和Bb的值得不同,有可能無法到達(dá)終點(diǎn)。
擲出4個(gè)整數(shù)各多少次可以到達(dá)終點(diǎn)呢?如果解不唯一輸出任意一組幾個(gè),如果無解輸出-1。
樣例
輸入
4 11
輸出
3 1
這個(gè)問題用數(shù)學(xué)語言表述就是“求整數(shù)x和y使得ax+by=1”。可以發(fā)現(xiàn),如果gcd(a,b≠1,顯然無
解。反之,如果gcd(a,b)=1,就可以通過擴(kuò)展原來的輾轉(zhuǎn)相除法來求解。事實(shí)上,一定存在整數(shù)對(x,y)使得ax+by=gcd(a,b),并可以用同樣的算法求得。設(shè) int extgcd(inta,intb,int&x,int&y)是求解該方程的函數(shù),其返回值是gcd(a,b與gcd一樣,我們可以遞歸地定義 extged。
假設(shè)已經(jīng)求得了
**(a%b)y’=gcd(a, b)
的整數(shù)解x和y。再將
a%b=a-(alb)xb
代入后就得到
ay’+b(x’-()xy)=gcd(a, b
而當(dāng)b=0時(shí)則有
a×1+b0=a=gcd(a,b)
將上述數(shù)學(xué)語言轉(zhuǎn)化成代碼后,就得到了如下程序。
**

#include<iostream> #include<cstdio> using namespace std; int gcd(int a, int b)//遞歸輾轉(zhuǎn)相除法求兩個(gè)數(shù)的最大公因數(shù) {if (b == 0)return a;elsereturn gcd(b, a % b); } void ex_gcd(int a, int b, int& x, int& y)//&是引用,不是地址 {if (b == 0){x = 1;y = 0;return;}else{ex_gcd(b, a % b, x, y);int t = x;x = y;y = t - (a / b) * y;} } int main() {int a, b, x, y;cin >> a >> b;ex_gcd(a, b, x, y);if (gcd(a, b) != 1)cout << -1 << endl;else{cout << x << " " << y << endl;}return 0; }

ax+by=gcd(a,b)的解的大小

只要看一下遞歸的方法就能知道, extged的復(fù)雜度和gcd的復(fù)雜度是相同的。但該函數(shù)所求的
ax+by=gcd(a,b)的解的大小又如何呢?
事實(shí)上如果ab≠0,可以知道x≤b且y≤a下面用歸納法來證明這一結(jié)論。在b=0的前一步,即a%b=0時(shí)有x=0且y=1,結(jié)論顯然成立。
假設(shè)調(diào)用 extgcd(b,a%b,y,x)后有x≤b且ly1≤a%b。
在 extgcd(a,b,x,y)中x=xy=y-(ab)x,所以有如下不等式成立。=≤b,y=y(ab)x≤y+(ab)xx1≤a%b+(a/b)×b=a

總結(jié)

以上是生活随笔為你收集整理的扩展欧几里得算法之双六问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。