终于找到了一个聪明的做法
首先说,这题完全可以暴力==
思路就是 先求出a和c的最大公约数,如果b和d的差不是最大公约数的整数倍,那么永远达不到这个数。
这大概是为数不多的聪明做法了,我看出gcd有关,但是没推导出来,我是弱鸡==
有两个闹钟。
第一个闹钟会在
时刻响铃。第二个闹钟会在
时刻响铃。请计算两个闹钟第一次同时响铃的具体时刻。
输入格式
第一行包含两个整数
。第二行包含两个整数
。输出格式
一个整数,表示第一次同时响铃的具体时刻。
如果永远都不可能同时响铃,则输出
。数据范围
所有测试点满足
。先看看弱鸡代码
#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; }
Thaqnk you forr aany oyher wonjderful article. Where ese may just anyone get
Replytuat kinnd of iinformation iin ssuch aan ideeal manner of writing?
I've a presentation subsequenjt week, and I am at the ook
for such information.