查看: 1439|回復: 1
打印 上一主題 下一主題

[GCJ] [翻譯]2014 1C A.Part Elf

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-5-11 18:25:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    https://code.google.com/codejam/contest/3004486/dashboard#s=p0

    突然看到GCJ開始,沒報名,就幫翻譯吧!

    大意:我們稱每個人都有可能是隻小精靈後代,我們可以用分數 P/Q 來表示有多少比例的小精靈血緣。如果有兩個人結婚,後代的小精靈血緣為親代的算術平均數(A+B)/2。我們訂純種的小精靈血緣比例是1/1,所有最初的親代要嘛是 1/1 要嘛是 0/1 ,今天有一個人知道自己的小精靈血緣比例,他想知道跟他最親的純種小精靈祖先相差幾代,如果超過40代都不存在的話就當作不存在。

    輸入說明:
    第一行有一個數字T,表示接下來有幾筆測資。每筆測資以P/Q的方式輸入,代表詢問的比例。

    Small  [tex]1%5Cleq%20P%2CQ%20%5Cleq100[/tex],[tex]GCD(P,Q)=1[/tex]
    Large [tex]1%5Cleq%20P%2CQ%20%5Cleq10%5E%7B12%7D[/tex],[tex]GCD%28P%2CQ%29%5Cneq%201[/tex]

    範例輸入:
    5
    1/2
    3/4
    1/4
    2/23
    123/31488範例輸出:
    Case #1: 1
    Case #2: 1
    Case #3: 2
    Case #4: impossible
    Case #5: 8題解:
    1.顯然的應該要先約分。
    2.Q約分後要是2的冪次才有解
    3.猜想:找最小的K滿足 [tex]%5Cfrac%7BP%7D%7BQ%7D%5Cgeq%202%5E%7B-k%7D[/tex],先說這是我亂猜的(事實上好像就是這樣)。

    測資說明


    如測資一:1/2
    可以化為[tex](0/1+1/1)/2[/tex],故解為1

    如測資二:3/4
    可以化為[tex](1/1+1/4)/2[/tex],1/4又可以化為[tex](1/2+1/2)/2[/tex],但注意我們要「最接近」的1/1,雖總深度為三,但答案是1。

    如測資五:123/31488
    約分後為1/256,深度為8


    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    頭香
    發表於 2014-5-11 20:43:54 | 只看該作者
    本帖最後由 domen111 於 2014-5-11 20:48 編輯

    既然你都寫的那麼完整了,看來我可以省發這題的解題文了
    附上我的AC Code
    #include<bits/stdc++.h>
  • using namespace std;
  • long long p,q;
  • void input()
  • {
  •         scanf("%lld/%lld",&p,&q);
  •         long long gcd=__gcd(p,q);
  •         p/=gcd;
  •         q/=gcd;
  • }
  • bool checkQ(long long n)
  • {
  •         while(n!=0)
  •         {
  •                 if(n!=1 && n&1!=0)
  •                         return false;
  •                 n>>=1;
  •         }
  •         return true;
  • }
  • int main()
  • {
  •         int T;
  •         cin>>T;
  •         for(int no=1;no<=T;no++)
  •         {
  •                 input();
  •                 if(!checkQ(q))
  •                 {
  •                         printf("Case #%d: impossible\n",no);
  •                         continue;
  •                 }
  •                 int ans=1;
  •                 while(q/2>p)
  •                 {
  •                         q/=2;
  •                         ans++;
  •                 }
  •                 printf("Case #%d: %d\n",no,ans);
  •         }
  • }





  • 評分

    參與人數 1金幣 +4 收起 理由
    Sylveon + 4

    查看全部評分

    蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表