1. 程式人生 > >ssoj4008: 紙牌遊戲(cards)

ssoj4008: 紙牌遊戲(cards)

時間限制: 1 Sec 記憶體限制: 512 MB Special Judge 提交: 57 解決: 17 [提交][狀態][部落格][加入收藏] 題目描述 華華和秀秀在玩紙牌遊戲,遊戲的規則如下:

初始時,桌面上有 n n張紙牌,每張紙牌上寫有一個正整數。遊戲開始時華華先在黑板上寫上數字0,之後秀秀和華華輪流選取紙牌(秀秀先手)。當一個人選定一張紙牌時,他需要將黑板上的數字改寫成這個數和紙牌上的數的最大公約數,然後將這張紙牌丟棄。當一個人寫下了1 或者無法選取紙牌時,他就輸了。

現在秀秀想知道:

  1. 當華華和秀秀都按照隨機策略選取卡片時,秀秀獲勝的概率有多少;

  2. 當華華和秀秀都按照最優策略選取卡片時,秀秀獲勝的概率有多少。

輸入 輸入第一行,包含一個正整數 n n。

輸入第二行,包含 n n個正整數,表示紙牌上的數字。

輸出 輸出兩個由空格隔開的實數,分別表示隨機策略下的獲勝概率和最優策略下的獲勝概率。

樣例輸入 4 1 2 3 4 樣例輸出 0.583333333 1.000000000 提示 評分說明

當你輸出的實數與標準答案的絕對誤差小於1e-6時,我們便認為你的輸出正確。這道題每個測試點設有部分分,評測時將配有Special judge。當你的第一問正確時,你將獲得該測試點60%的分數;當你第二問正確時,你將獲得該測試點40%的分數。每個測試點的兩問分開計分,但如果你的輸出格式不正確,則該測試點不得分。

資料範圍

n≤300, 紙牌上的數≤1000。

題解: 先考慮第一問。發現每一次操作的結果有兩種:改變原來的數或不改變。因為我們關心的只有黑板上的數和回合數,由於前面選的數一定是黑板上的數的倍數,故每一類數是否選過,選過多少次,可由黑板上的數推出,用這些即可轉移:記f[i][j]為前i輪結束後,黑板上的數位j的概率。考慮主動轉移,對於不變,則選的數一定是j的倍數,概率為s[j]-i(s[j]為j的倍數的個數)/(n-i);對於邊的,則列舉每一個不是j的倍數的a[k],概率為1/(n-i),對於i為偶數,j為1或i=n,n為奇數,則華華贏,統計答案即可。 對於第二問,考慮什麼時候華華必勝,假設華華第一個選取了a,那麼若對於a的每一個最小單位因數(即不是a[i]中任何數的倍數的數),都有奇數個它的倍數,那麼用後手抵消先手的思想,華華一定贏;否則對方一定贏。考慮如何選出最小單位因數,將任意兩個數求gcd,在求得的數中刪去每一個數的倍數,剩下的即是。因為對每一個最小單位因數,一定是其中兩數的gcd(不是的話又因為它是a中的因數,那它一定是其餘因數的倍數),而這剩下的數也一定滿足不是a中的倍數,故可行。