2016暑期集訓16A強迫症

強迫症

時間限制: 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章