您的位置:首页 > 其它

2016暑期集训16A强迫症

2016-08-23 22:42 246 查看

强迫症

时间限制: 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∗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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcd