noip模拟赛 铺瓷砖

【问题描述】
有一面很长很长的墙。 你需要在这面墙上贴上两行瓷砖。 你的手头有两种不同尺寸的瓷
砖, 你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度
为A/B贴在第二行的每块瓷砖长度为C/D.
本问题中你并不需要关心瓷砖的宽度。

如上图所示, 两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙
是对齐的。 你想要知道, 最短铺多少距离后, 两排瓷砖的缝隙会再一次对齐。
【输入】
输入的第 1 行包含一个正整数 T,表示测试数据的组数。
接下来 T 行, 每行 4 个正整数 ABCD,表示该组测试数据中,两种瓷砖的长度分别为A/B,C/D.

【输出】
输出包含 T 行, 第 i 行包含一个分数或整数, 表示第 i 组数据的答案。 如果答案为分数,
则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出
一个整数 X
【输入输出样例 1

tile.in tile.out
2
1 2 1 3
1 2 5 6
1
5/2


见选手目录下的 tile/tile1.in tile/tile1.out
【输入输出样例 1 说明】
对于第一组数据,第一行瓷砖贴 2 块,第二行贴 3 块,总长度都为 1,即在距离起始位
置长度为 1 的位置两行瓷砖的缝隙会再次对齐。
对于第二组数据, 第一行瓷砖贴 5 块,第二行贴 3 块,总长度都为5/2

 

分析:实际上就是求最小公倍数.分数的话先通分,然后对分子求最小公倍数就可以了,注意爆int.

#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;
ll T, a, b, c, d;

ll gcd(ll a, ll b)
{
    if (!b)
        return a;
    return gcd(b, a % b);
}

int main()
{
    scanf("%lld", &T);
    while (T--)
    {
        scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
        ll t, t2;
            t = b / gcd(b, d) * d;
        a *= (t / b);
        c *= (t / d);
        t2 = a / gcd(c, a) * c;
        if (t2 % t == 0)
            printf("%lld\n", t2 / t);
        else
        {
            ll p = gcd(t2, t);
            t /= p;
            t2 /= p;
            printf("%lld/%lld\n", t2, t);
        }
    }
    
    return 0;
}

 

posted @ 2017-10-26 18:30  zbtrs  阅读(510)  评论(0编辑  收藏  举报