【浮*光】 #noip模拟9.26# 2016清北学堂

目录

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); 
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值