2016暑期集训16A强迫症

强迫症

时间限制: 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
#include
#include
#include
#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;
}

你可能感兴趣的:(暑假集训)