强迫症
时间限制: 1 Sec 内存限制: 128 MB
提交: 7 解决: 5
[提交][状态][讨论版]
题目描述
人行道铺着两行地砖,第一行每块的长度是A/B,第二行每块的长度是X/Y。两行砖块第一块的一边是对齐的。
作为一个强迫症患者,看到这样的地砖你很不爽,于是就想知道,最少隔多少距离后两行地砖的缝隙又会对齐。
输入
输入第一行包含一个整数T,表示测试点组数。
接下来T行,每行两个分数,格式为A/B X/Y,两个分数中间用一个空格隔开。
输出
T行,每行包含一个分数(若答案为整数则输出整数),表示每组数据的答案。分数必须以最简形式输出。
样例输入
2
3/2 5/8
4/3 3/10
样例输出
15/2
12
提示
30%的数据A,B,X,Y<=20
70%的数据T<=10
100%的数据1<=A,B,X,Y,<=10,000,T<=100,000
今天这套题我爆零了,很忧伤……
我渣渣,我垃圾,我cei爆,
但我宁愿笑着流泪也不哭着说后悔。
这道题是个简单的gcd处理,我发现自己考试的程序,在数据中出现
a与x成倍数关系,b与y成倍数关系我就错了。原因是我只做了两遍gcd
程序最后答案的分母又写成了b
∗
<script type="math/tex" id="MathJax-Element-11">*</script>y,错上加错,反而普通的点对了。
题解
70% 我们的目标是找最小的k,使得(a*k/b)/(x/y)是整数。枚举k后判断即可。
100% 算gcd(a*y,b*x),不多说了。
哎,还是老应说的对,要踩在坚实的土地上。
下面是我正确的代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int T;
ll gcd(ll x,ll y)
{
if (y==0) return x;
else return gcd(y,x%y);
}
int main()
{
scanf("%d",&T);
while (T--)
{
int a,b,x,y;
char ch;
scanf("%d",&a);ch=getchar();
scanf("%d",&b);ch=getchar();
scanf("%d",&x);ch=getchar();
scanf("%d",&y);ch=getchar();
ll z=gcd(b,y);
ll c=b*y/z;
ll e=a*c/b;
ll f=x*c/y;
ll g=gcd(e,f);
ll h=e*f/g;
ll o=gcd(h,c);
if (c/o==1)
printf("%lld\n",h/o);
else
printf("%lld/%lld\n",h/o,c/o);
}
return 0;
}