題目描述
我們把這兩隻青蛙分別叫做青蛙A和青蛙B,並且規定緯度線上東經0度處爲原點,由東往西爲正方向,單位長度1米,這樣我們就得到了一條首尾相接的數軸。設青蛙A的出發點座標是x,青蛙B的出發點座標是y。青蛙A一次能跳m米,青蛙B一次能跳n米,兩隻青蛙跳一次所花費的時間相同。緯度線總長L米。現在要你求出它們跳了幾次以後纔會碰面。
輸入
輸出
樣例輸入
1 2 3 4 5
樣例輸出
4
垃圾數論題毀我青春
很明確的知道這是一道數論題,很明確的知道要用擴展歐幾里得算法進行求解。
然而。。
就是寫不出來。
我們首先可以這樣想
(x+m*X)%L==(y+n*Y)%L
--->(x-y)=X*L+Y*(n-m)
套用擴展歐幾里得算法ax+by=gcd(a,b)的模板
不難解出一組x,y
之後再看一看X-Y是否能整除k得到是否有解
然而擴展歐幾里得算法解出的結果可能是負的!!!我們需要將其轉換爲正數。
卡了好久。。。
貼上AC代碼:
#include<iostream>
#include<stdio.h>
#define LL long long
using namespace std;
LL x,y,a,b;
LL X,Y,m,n,L;// r1*x+r2*y=W------>y即爲答案
LL exgcd(LL a,LL b,LL &x,LL &y){
if(b==0){x=1;y=0;return a;}
else{
LL r=exgcd(b,a%b,x,y);
LL t=y;
y=x-(a/b)*y;
x=t;
return r;
}
}
int main(){
cin>>X>>Y>>m>>n>>L;
LL r1=L,r2=n-m,W=X-Y;
LL k=exgcd(r2,r1,x,y);
LL r=L/k;
if(W%k!=0)puts("Impossible");
else printf("%lld",(W/k*x%r+r)%r);
return 0;
}
順便吐槽一下堂堂P大OJ既然不支持<bits/stdc++.h>