目录
T1 铺瓷砖 ヽ(✿゚▽゚)ノ
T2 小Y的问题 (๑•̀ㅂ•́)و✧
T3 水管工的难题 ╰(*°▽°*)╯
T1 铺瓷砖
【问题描述】
- 有一面很长很长的墙。你需要在这面墙上贴上两行瓷砖。
- 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行。
- 贴在第一行的每块瓷砖长度为A/B,贴在第二行的每块瓷砖长度为C/D。
- 如上图所示,两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙
- 是对齐的。你想要知道, 最短铺多少距离后, 两排瓷砖的缝隙会再一次对齐。
【输入】
输入的第 1 行包含一个正整数 T,表示测试数据的组数。
接下来 T 行, 每行 4 个正整数,即两种瓷砖的长度分别为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 |
【输入输出样例 1 说明】
对于第一组数据,第一行瓷砖贴 2 块,第二行贴 3 块,总长度都为 1,即在距离起始位
置长度为 1 的位置两行瓷砖的缝隙会再次对齐。
对于第二组数据, 第一行瓷砖贴 5 块,第二行贴 3 块,总长度都为5/2
【代码实现】
因为是用一种很神奇的方法写的所以也说不清楚...
模拟一下过程,找找规律,就可以先通分再找gcd。
利用 lcm*gcd=a*b,找出分数的 lcm,再同除约分。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
/*【铺瓷砖】
有一面很长很长的墙。你需要在这面墙上贴上两行瓷砖。你的手头有两种不同尺寸的瓷砖,
你希望用这两种瓷砖各贴一行。贴在第一行的每块瓷砖长度为A/B,贴在第二行的每块瓷砖长度为C/D。
想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。*/
//...最小公倍数??还是分数的最小公倍数?
void reads(ll &x){ //读入优化(正负整数)
int fx=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')fx=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=fx; //正负号
}
ll gcd(ll x,ll y){ //x>y
return (y==0)?x:gcd(y,x%y);
}
int main(){
freopen("tile.in","r",stdin);
freopen("tile.out","w",stdout);
ll T,a,b,c,d; reads(T);
while(T--){
reads(a),reads(b),reads(c),reads(d);
ll t1=a*d,t2=b*c; if(t1<t2) swap(t1,t2);
ll gcds=gcd(t1,t2),muls=t1*t2;
ll lcms=muls/gcds,yue=gcd(lcms,b*d);
if(yue==b*d) printf("%lld\n",lcms/(b*d));
else printf("%lld/%lld\n",lcms/yue,(b*d)/yue);
}
}