(扩展欧几里得)青蛙的约会
題意
兩只青蛙在網上相識了,它們聊得很開心,于是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,于是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特征,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝著某個方向跳下去,總能碰到對方的。但是除非這兩只青蛙在同一時間跳到同一點上,不然是永遠都不可能碰面的。為了幫助這兩只樂觀的青蛙,你被要求寫一個程序來判斷這兩只青蛙是否能夠碰面,會在什么時候碰面。
我們把這兩只青蛙分別叫做青蛙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。。可能是由于他那個函數的問題
總結
以上是生活随笔為你收集整理的(扩展欧几里得)青蛙的约会的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino的串口结束符及串口缓冲区
- 下一篇: (STL,set,priority_qu