1. 程式人生 > >cf-787a

cf-787a

http main name out swap std pac 方程 esp

https://vjudge.net/problem/709847/origin

拓展歐幾裏德:a*x+b=c*y+d; -> a*x+c*y=d-b;

代碼:

#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return d;
}

int main(){
ll a,b,C,D,x,y;
while(cin>>a>>b>>C>>D){
if(b<D){//若b<D,那麽y<0,
//原方程式等價於y=(a*x+b-d)/c,
//下面的處理可保證x不小於0,但是不能保證y,
//所以需要保證(a*x+b-d)%c==0,即:保證:b>D;若不成立需交換;
swap(a,C);
swap(b,D);
}
ll d = exgcd(a,C,x,y);
ll c = D-b;
if(c%d) cout<<"-1"<<endl;
else{
x=x*(c/d);
x=(x%(C/d)+(C/d))%(C/d);
cout<<b+a*x<<endl;
}
}
return 0;
}

cf-787a