poj1061-青蛙的约会(拓展欧几里得java)
題目:
兩只青蛙在網上相識了,它們聊得很開心,于是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,于是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特征,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝著某個方向跳下去,總能碰到對方的。但是除非這兩只青蛙在同一時間跳到同一點上,不然是永遠都不可能碰面的。為了幫助這兩只樂觀的青蛙,你被要求寫一個程序來判斷這兩只青蛙是否能夠碰面,會在什么時候碰面。
我們把這兩只青蛙分別叫做青蛙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
分析
拓展歐幾里得以前記過
分析一下設見面時間為t。青蛙A的位置是x mt;青蛙B的位置是y nt;兩只青蛙項目,那么說明兩只青蛙之間要么誰比誰多整數圈數。那么就得到x mt-(y nt)=k*L.變形一下(m-n)t-kL=(y-x).這就是m-n,L,y-x分別已知,而t和k未知,求最少的t.(t越少跳的越少。)
那么設m-n=a,L=b,t=X,-k=Y,y-x=c.原始就是aX bY=c,其中a,b,c已知,求X最小正整數。你要判斷c是否與gcd(a,b)互質,如果不互質則沒有結果。
接著你求出的初始X是gcd(a,b)的情況,你要判斷c是否是gcd的倍數,如果跟他互質,那么涼涼,不可能遇到,不滿足extgcd的條件,如果是倍數。假設n倍,你可以你可以nXa,nYa,c相當于同時擴大倍的一種解,但是這不一定是最優解,你需要根據實際加減操作找到最小正解!
ac代碼
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer;public class poj1061 {static long X=0; static long Y=0;public static void main(String[] args) throws IOException {// TODO 自動生成的方法存根StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));in.nextToken();long x=(long)in.nval;//A起始位置in.nextToken();long y=(long)in.nval;//B起始位置in.nextToken();long m=(long)in.nval;//A的速率in.nextToken();long n=(long)in.nval;//B的速率in.nextToken();long L=(long)in.nval;//長度long a=m-n;long c=y-x;long b=L;if(a<0) {a=-a;c=-c;}long res=extgcd(a,b);// res=gcd(a,b)//c必須是res的倍數,如果互質的話就不滿足拓展歐幾里得的方程式,而對應的結果首先要跟著倍數擴大if(c%res!=0) {out.println("Impossible");}else {/** 可能難理解一點* x=x0 (b/gcd(a,b))*t* x=x0 (b/res)*t找到最小的正整數x,那么就是x%(b/res)了,如果小于0就是(x%b/res) b/res了*/X=X*(c/res);long t=b/res;if(X>=0)X=X%t;elseX=X%t t;out.println(X);}out.flush();}private static long extgcd(long a, long b) {if(b==0){X=1;Y=0;return a;}long res=extgcd(b, a%b);long team=X;X=Y;Y=team-(a/b)*Y;return res;} }github地址
- 歡迎關注我的個人公眾號:bigsai
總結
以上是生活随笔為你收集整理的poj1061-青蛙的约会(拓展欧几里得java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唯一分解定理(算术基本定理)详解——hd
- 下一篇: 欧拉函数/欧拉函数打表 lightoj1