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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

(扩展欧几里得)青蛙的约会

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

題意

兩只青蛙在網上相識了,它們聊得很開心,于是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,于是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特征,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝著某個方向跳下去,總能碰到對方的。但是除非這兩只青蛙在同一時間跳到同一點上,不然是永遠都不可能碰面的。為了幫助這兩只樂觀的青蛙,你被要求寫一個程序來判斷這兩只青蛙是否能夠碰面,會在什么時候碰面。
我們把這兩只青蛙分別叫做青蛙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

分析與解答

代碼和部分解釋參考:
https://blog.csdn.net/chaoyueziji123/article/details/38510323
我們可以設在第s步達到。則方程為:(x+m*s)-(y+n*s)=k*L(k=0,1,2….);
可以化解為(n-m)*s+k*L=x-y;等價為A*x+B*y=C;

然后就是模板的問題,我發現之前我寫的那個模板經常性的wrong answer,我想應該是最后找最小正整數的時候出錯了
現在改用下面的這個新模板,這個模板非常好,也不用寫gcd函數了,他直接就起到了gcd函數的功能,其實就是比gcd函數多了一個xy之間的變換
還有一點,最后找小正整數直接套公式把,不要再while找了
公式:對于ax+by=c,知道任意個解x,那么x=(x%k+k)%k求出的就是最小正整數解,同樣,對應的y我們也可以搞定,這里k是b/gcd(a,b)
注意那是c對應的x
我們調用exgcd是ax+by=gcd(a,b),所以求出一個解x0之后,那個公式里x不是x0
現在我們知道x0,就需要先轉化為x,x=x0*(c/gcd(a,b))
然后用那個公式
第一個代碼是別人的,第二個是我寫的,多了個gcd,但是時間比第一個快15ms。。可能是由于他那個函數的問題

#include<iostream> #include<cstdio> using namespace std; long long X,Y; long long exgcd(long a,long b) {if(b==0){X=1;Y=0;return a;}long long d=exgcd(b,a%b);long long t=X-a/b*Y;X=Y;Y=t;return d; } int main() {long x,y,m,n,L;cin>>x>>y>>m>>n>>L;long long d=exgcd(n-m,L);//d是類似于gcd(a,b) long long r=L/d;if((x-y)%d) puts("Impossible");else{cout<<((x-y)/d*X%r+r)%r<<endl;// Ax+By = Gcd(A, B)的每個解乘上 C/Gcd(A, B) 就是ax+by=c的一個解 // x1 = x0*(C/Gcd(A,B)),y1 = y0*(C/Gcd(A,B))// x=(x%k+k)%k;最小正整數解 // y=(1-t*x)/k;}return 0; } #include<iostream> #include<cstdio> using namespace std;long long gcd(long long x,long long y){if(y) return gcd(y,x%y);return x; }void Ex_gcd(long long a, long long b, long long &x, long long &y) {if(b == 0)//遞歸出口{x = 1;y = 0;return;}long long x1, y1;Ex_gcd(b, a%b, x1, y1);x = y1;y = x1-(a/b)*y1; }int main(){long long x,y,m,n,l,s,k;cin>>x>>y>>m>>n>>l;long long a,b,c,d,t;a=n-m;b=l;c=x-y;d=gcd(a,b);t=b/d;if(c%d) {cout<<"Impossible";return 0;}Ex_gcd(a,b,s,k);s=(c/d*s%t+t)%t;cout<<s;}

總結

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

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