思路:设第一个人x,第二个y,显然有b+ax = d+cy,ax-cy=d-b,求最小的x解即可,由于y又要保证为非负数,x要一直增加到y为非负数。
# include <bits/stdc++.h>
using namespace std;
int a, b, c, d, x, y, gd;
int ex_gcd(int a, int b)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
gd = ex_gcd(b, a%b);
int t = x;
x = y;
y = t-(a/b)*y;
return gd;
}
int main()
{
int A, B, C, D, t, tmp=0;
scanf("%d%d%d%d",&A,&B,&C,&D);
a = A;
b = -C;
c = D-B;
gd = ex_gcd(a, b);
if(c % gd != 0)
return 0*puts("-1");
x = x*c/gd;
y = y*c/gd;
int k = b/gd;
x = (x%k+k)%k;
if(x < 0) x += abs(k);
/*
while((c - a*x)/b < 0) x += abs(k);
下面的东西可以用这个暴力循环代替。
*/
if((c - a*x)/b < 0)
{
tmp = a*x-c;
k = abs(k);
t = (tmp%(a*k)+(a*k))%(a*k);
if(t < 0)
t += a*k;
tmp = (t-tmp)/(a*k);
}
printf("%d\n",B+A*(x+k*tmp));
return 0;
}