備戰省賽組隊訓練賽第一場(補題)E 不存在的泳池

  問題 E: 不存在的泳池時間限制: 1 Sec  內存限制: 128 MB

提交: 553 解決: 239
[提交] [狀態] [命題人:外部導入]題目描述小w是雲南中醫學院的同學,有一天他看到了學校的百度百科介紹:
截止到2014年5月,雲南中醫學院圖書館紙本藏書74.8457萬冊,紙質期刊388種,館藏線裝古籍圖書1.8萬冊,電子資源總量35TB,擁有中、外文數據庫25個,電子圖書29.5萬冊(鏡像)、包庫130萬冊。古籍線裝圖書1.8萬餘冊,有39種列爲本館珍善本,如《徹滕八編》、《趙氏醫貫》等明清版本、臺灣文淵閣版本《四庫全書》,按《全國古籍善本書總目》分類表(即:經·史·子·集四部分類)部編列、上架、供讀者使用。
顯然學校圖書館的佔地面積非常大,於是他開始想象…如果他有一個跟圖書館一樣大的游泳池?!
如果有一個那麼大的游泳池,他就可以邀請女神一起去游泳…
如果有一個那麼大的游泳池,他還可以劃開一半出租,收取門票費賺錢…這樣等賺了一些錢之後,就招一些游泳教練來,然後對外招生,招收學生繼續賺更多的錢!
如果有一個那麼大的游泳池,他還能把泳池裏的水全部放光…開一個呂子喬心目中最大最棒的泳池派對!

等有了更多的錢,就可以在第一個泳池旁邊再建一個一樣大的泳池…
小w一邊流口水一邊想自己的未來,一想到女神看到自己事業有成,靠一個游泳池白手起家發家致富,對自己投懷送抱,高興的根本合不攏嘴。
這時候旁邊的小q作爲小w的室友,隨口提了一句:“這麼大的泳池,你怎麼換水?”
顯然小w是個有原則的人,他不會讓自己的泳池像不法商家一樣不換水,用不乾淨的水給別人使用或者給自己使用。
小w百度了之後發現…淘寶裏有一家店賣一種一次性抽水機,這種一次性抽水機很神奇,它有兩個按鈕:
1.如果泳池裏的水(立方米)是3的倍數,那麼可以按第一個按鈕讓它抽走泳池裏三分之二的水
2.如果泳池裏的水(立方米)是2的倍數,那麼可以按第二個按鈕讓它抽走泳池裏二分之一的水
小w雖然是個有原則的人,但是作爲一個商人,他需要節省錢…而且他現在有兩個泳池…但是顯然這種抽水機不能把水抽光,水越少,性價比就越低。
但是兩個泳池建在一起,如果兩個泳池的水面不一樣高,那麼小w會很不開心,所以他想用這種抽水機,把兩個泳池裏的水抽成一樣多。然後再考慮別的…當然在保證能把兩個泳池裏的水抽成一樣多的情況下…他希望花的錢最少…
(不管了!好看最重要,好看才能吸引顧客啊!先好看!再考慮怎麼換水吧)
輸入多組測試數據,給出A,B表示兩個泳池當前的水量(立方米)(1<=A,B<=10^9)
輸出每組測試數據輸出一個整數表示至少需要買多少個一次性抽水機,若買多少個都不能讓泳池的水相等,則輸出"-1"
樣例輸入複製樣例數據
5 20
14 8
6 6
樣例輸出
2
-1
0



比賽時光光看了這道題,我沒仔細讀,補題時發現題意有些難猜,但肯定是會用到歐幾里得(求最大公因數)
補題時理解題意爲每組數據的兩個數都要化到他們倆的最大公因數,如果最後化不到一樣的數則不存在。
後來寫了些代碼運行只能過測試用例,因爲如果輸入的是 6,8 他倆的最大公因數爲2 ,如果每次進行/2 或 /3
運算的話,6如果先進行 /3運算變爲2 如果進行 /2運算的話則變爲 3 ,3 的話不能繼續 /2 運算最後化不到 2這個最大公因數,而 6,8最後不應該輸出 - 1;
所以 應該先將兩個數分別對最大公因數進行 /= ,然後得到兩個數進行 /2 或/3 操作,看一下最後是否相等即可;
//
//
下面是最後的正確代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
int gcd(ll a,ll b)
{
    if(!b)
        return a;
    else
        return gcd(b,a%b);
}
int main()
{
    ll n,m;
    while(~scanf("%lld%lld",&n,&m))
    {
        ll num=0;
        ll k=gcd(n,m);
        //printf("%lld\n",k);
        ll ans=0;
        n/=k;m/=k;					//最後加上的一部操作
        if(n==m)
            printf("0\n");
        else
        {
            while(n%3==0)
            {
                n/=3;
                ans++;
            }
            while(n%2==0)
            {
                n/=2;
                ans++;
            }
            while(m%3==0)
            {
                m/=3;
                ans++;
            }
            while(m%2==0)
            {
                m/=2;
                ans++;
            }
            if(n!=m)
                printf("-1\n");
            else
                printf("%lld\n",ans);
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章