题目大意:
有一个怪物在追赶 Rick 和 Morty 他们两个人很害怕 所以不停的尖叫
Rick在 b, b + a, b + 2a, b + 3a, ... 时刻尖叫
Morty在 d, d + c, d + 2c, d + 3c, .... 时刻尖叫
问两个人会不会在同一时刻尖叫
分析:
扩展欧几里得 略微分析便可得到方程
若想两人同时尖叫 需满足 b + a*x = d + c*y ---> a*x - c*y = d - b
求出 满足方程的最小非负整数对 x,y
AC代码:
#include<stdio.h>
#include <math.h>
int gcd(int a,int b,int &x,int &y){
if (b==0){
x=1,y=0;
return a;
}
int ans=gcd(b,a%b,y,x);
y-=(a/b)*x;
return ans;
}
int main (){
int a,b,c,d;
while (scanf ("%d%d%d%d",&a,&b,&c,&d)!=EOF){
int x,y;
int g=gcd(a,-c,x,y);
if ((d-b)%g!=0){// 不满足条件
printf ("-1\n");
continue;
}
x=x*(d-b)/g;// 求出方程的x
// 接下来三行求出最小非负整数x
x=x%(-c/g);
if (x<0)
x+=fabs(-c/g);
y=((d-b)-a*x)/(-c); // 求出方程的y
while (y<0){
x=x+fabs(-c/g);//
y=((d-b)-a*x)/(-c);
}
printf ("%d\n",b+x*a);
}
return 0;
}
其实这题可以水
AC代码:
#include<stdio.h>
int main (){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int flag=1;
for (int i=1;i<=200&&flag;i++){
for (int j=1;j<=200&&flag;j++){
if ((i*a-j*c)==(d-b+a-c)){
printf ("%d\n",d+(j-1)*c);
flag=0;
}
}
}
if (flag)
printf ("-1\n");
return 0;
}