问题介绍:
给出a,b,c,d四个数,两个人在尖叫,第一个人在b,b+a,b+2a,b+3a……时刻尖叫,第二个人在d,d+c,d+2c,d+3c……时刻尖叫,问他们第一次在相同时刻尖叫是什么时候。
问题分析:
1、首先数据范围不大可以暴力枚举,设第一个人x,第二个y,显然有b+ax = d+cy,ax-cy=d-b判断d-b是不是gcd(a,-c)的倍数,还是扩展欧几里德。
代码:
2、设第一个人x,第二个y,显然有b+ax = d+cy,ax-cy=d-b,求最小的x解即可,由于y又要保证为非负数,x要一直增加到y为非负数。
实现代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
/**
2018/1/29
完成;
**/
#define ll long long
const int N = 1e5+7;
int n,t;
int ext_gcd(int a,int b,int &x, int &y)
{
if(!b) {x = 1; y = 0; return a;}
else {
int r = ext_gcd(b,a%b,x,y);
int temp = x;
x = y;
y = temp - (a/b)*y;
return r;
}
}
int main()
{
int A,a,B,b,C,c,D,d,g,x,y;
scanf("%d%d%d%d",&A,&B,&C,&D);
a = A;
b = -C;
c = D - B;
g = ext_gcd(a,b,x,y);
if(c%g!=0) printf("-1\n");
else
{
x *= c/g;
y *= c/g;
int k = b/g;
x = (x%k+k)%k;
if(x < 0) x += abs(k);
while((c - a*x)/b < 0) x += abs(k);
printf("%d\n",B+A*x);
}
return 0;
}