首页 > 代码库 > 清北第三套题

清北第三套题

                                                  铺瓷砖
                                (tile.cpp/c/pas)
【问题描述】
    有一面很长很长的墙。 你需要在这面墙上贴上两行瓷砖。 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为 AB ,贴在第二行的每块瓷砖长度为CD 。本问题中你并不需要关心瓷砖的宽度。
    如上图所示, 两排瓷砖从同一起始位置开始向右排列, 两排瓷砖的第一块的左端的缝隙是对齐的。你想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。
【输入】
    输入的第 1 行包含一个正整数 T,表示测试数据的组数。
    接下来 T 行,每行 4 个正整数 A,B,C,D,表示该组测试数据中,两种瓷砖的长度分别为 AB 和CD 。
【输出】
    输出包含 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 块,总长度都为 52 。
【输入输出样例 2】
    见选手目录下的 tile/tile2.in 与 tile/tile2.out
【数据规模与约定】
    对于 50%的数据,1≤A,B,C,D≤20
    对于 70%的数据,T≤10
    对于 100%的数据,T≤100,000,1≤A,B,C,D≤10,000

 

题解:求出两个分母的最小公倍数即为答案。水。

 

技术分享
#include<cstdio>#include<iostream>#include<algorithm>#define ll long longusing namespace std;int T;ll fz1,fz2,fm;int a,b,c,d;ll gcd1(ll x, ll y)//最大公因数 {    if (y==0) return x;    ll k=x%y;    gcd1(y,k);}int main(){    freopen("tile.in","r",stdin);    freopen("tile.out","w",stdout);        scanf("%d",&T);    while (T--)      {             scanf("%d%d%d%d",&a,&b,&c,&d);            ll k1=gcd1(b,d);             fm=b/k1*k1*(d/k1);//通分             fz1=fm/b*a;            fz2=fm/d*c;            k1=gcd1(fz1,fz2);            ll fz=k1*(fz1/k1)*(fz2/k1);//化为最简整数比             if (fz%fm==0) cout<<fz/fm<<endl;              else                 {                    k1=gcd1(fz,fm);                    fz/=k1;fm/=k1;                    cout<<fz<</<<fm<<endl;                }              }          fclose(stdin);    fclose(stdout);        return 0;}
求最小公倍数

 

清北第三套题