终于找到了一个聪明的做法

首先说,这题完全可以暴力==

思路就是  先求出a和c的最大公约数,如果b和d的差不是最大公约数的整数倍,那么永远达不到这个数。
这大概是为数不多的聪明做法了,我看出gcd有关,但是没推导出来,我是弱鸡==


有两个闹钟。

第一个闹钟会在 b,b+a,b+2a,b+3a, 时刻响铃。

第二个闹钟会在 d,d+c,d+2c,d+3c, 时刻响铃。

请计算两个闹钟第一次同时响铃的具体时刻。

输入格式

第一行包含两个整数 a,b

第二行包含两个整数 c,d

输出格式

一个整数,表示第一次同时响铃的具体时刻。

如果永远都不可能同时响铃,则输出 1

数据范围

所有测试点满足 1a,b,c,d100

先看看弱鸡代码


#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	ll a,b,c,d,t,k=b,f=d;
	cin>>a>>b>>c>>d;
	k=b;f=d;
	int flag = 0,i=0;
	while(1)
	{
		if(k==f)	break;
		if(k-f<0)
			k+=a;
		if(k-f>0)
			f+=c;
		if(i++==100000)
		{
			flag=1;
			break;
		}
	}
	if(flag==0)	cout<<k;
	else cout<<-1;
}


再看看大佬代码


#include<bits/stdc++.h>
using namespace std;
int gcd(int n,int m){               //最大公约数
    return m?gcd(m,n%m):n;
}
int main(){
    int a,b,c,d;
    int x=0,y=0;                    //x为a的倍数 y为c的倍数
    cin >> a >> b >> c >> d;
    int n=gcd(a,c);                 //n为a与c的最小公倍数
    int g=max((b-d),(d-b));         //求出b与d的差值
    if(g%n==0){                     //如果b与d的差值是n的倍数则说明可以找到
        while((a*x+b)!=(c*y+d)){    //利用循环找到那个时刻
            if((a*x+b)<(c*y+d))
                x++;
            else
                y++;
        }
        cout << a*x+b;
    }
    else                            //否则返回-1
        cout << -1;
    return 0;
}