2016暑期集训16A强迫症
2016-08-23 22:42
246 查看
强迫症
时间限制: 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<cstdio> #include<cstring> #include<iostream> #include<algorithm> #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; }
相关文章推荐
- 2016暑期集训14A找朋友
- 2016暑期集训10 C吴传之火烧连营
- 2016暑期集训14B 奶牛逃跑 cowrun
- 2016暑期集训---搜索(简单BFS)
- 2016暑期集训1A 组合数
- 2016-2017 HPU暑期集训练习赛
- 2016暑期集训2——数论(知识点,模板,简单题题解)
- 2016暑期集训1B 构造回文字符串
- 2016暑期集训10 A魏传之长坂逆袭
- 2016暑期集训---搜索(简单BFS+路径储存)
- 2016暑期集训---搜索(BFS 八方向马步问题)
- 2016暑期集训集中贴
- 2016暑期集训---搜索(整数拆分)
- 2016暑期集训1C 最长回文
- 2016暑期集训4——数据结构(知识点,模板,简单题题解)
- 2016暑期集训---搜索(简单BFS)
- 2016暑期集训12C L国货物运输 HDU 5699 货物运输
- 2016暑期集训16B手套
- 2016暑期集训13 B瞬间移动 HDU 5698
- 2016暑期集训16C星座