質數取石子

2022-05-10 03:57:53 字數 1481 閱讀 8873

dd 和 mm 正在玩取石子遊戲。他們的遊戲規則是這樣的:桌上有若干石子,dd 先取,輪流取,每次必須取質數個。如果某一時刻某一方無法從桌上的石子中取質數個,比如說剩下 0 個或 1 個石子,那麼他/她就輸了。

dd 和 mm 都很聰明,不管哪方存在乙個可以必勝的最優策略,他/她都會按照最優策略保證勝利。於是,dd 想知道,對於給定的桌面上的石子數,他究竟能不能取得勝利呢?

當 dd 確定會取得勝利時,他會說:「不管 mm 選擇怎樣的取石子策略,我都能保證至多 x 步以後就能取得勝利。」那麼,最小的滿足要求的 x 是多少呢?注意,不管是 dd 取一次石子還是 mm 取一次石子都應該被計算為「一步」。

第一行有乙個整數 n,表示這個輸入檔案中包含 n 個測試資料。

第二行開始,每行有乙個測試資料,其中僅包含乙個整數,表示桌面上的石子數。

你需要對於每個輸入檔案中的 n 個測試資料輸出相應的 n 行。

如果對於該種情形是 dd 一定取得勝利,那麼輸出最小的 x。否則該行輸出 -1。

389

16

1

-13

樣例說明

當桌上有 8 個石子時,先取的 dd 只需要取走 7 個石子剩下 1 個就可以在一步之後保證勝利,輸出 1。

當桌上有 9 個石子時。若 dd 取走 2 個,mm 會取走 7 個,剩下 0 個,dd 輸。若 dd 取走 3 個,mm 會取走 5 個,剩下 1 個,dd 輸。dd 取走 5 個或者 7 個的情況同理可知。所以當桌上有 9 個石子時,不管 dd 怎麼取,mm 都可以讓 dd 輸,輸出 -1。

當桌上有 16 個石子時,dd 可以保證在 3 步以內取得勝利。可以證明,為了在 3 步內取得勝利,dd 第一步必須取 7 個石子。剩下 9 個石子之後,不管第二步 mm 怎麼取,dd 取了第三步以後可以保證勝利,所以輸出 3。

資料範圍

輸入檔案中的資料數 n<=10。

每次桌上初始的石子數都不超過 20000。

時間限制:1000ms

空間限制:256mbyte

也是比較水的一道題,注意一下步數就好 了。

#include#include

#include

#define maxn 20200

using

namespace

std;

intcun[maxn],tot,s[maxn],n,t,ce[maxn],f[maxn],step[maxn];

void

gp()

}}int find(int

x)

if(!ce) step[x] = max(step[x - cun[i]] + 1

,step[x]);

i++;

}if(ce) return

f[x];

f[x] = 0

;

return

f[x];

}int

main()

}

質數取石子

dd 和 mm 正在玩取石子遊戲。他們的遊戲規則是這樣的 桌上有若干石子,dd 先取,輪流取,每次必須取質數個。如果某一時刻某一方無法從桌上的石子中取質數個,比如說剩下 0 個或 1 個石子,那麼他 她就輸了。dd 和 mm 都很聰明,不管哪方存在乙個可以必勝的最優策略,他 她都會按照最優策略保證勝...

動態規劃 質數取石子

題目描述 dd 和 mm 正在玩取石子遊戲。他們的遊戲規則是這樣的 桌上有若干石子,dd 先取,輪流取,每次必須取質數個。如果某一時刻某一方無法從桌上的石子中取質數個,比如說剩下 0 個或 1 個石子,那麼他 她就輸了。dd 和 mm 都很聰明,不管哪方存在乙個可以必勝的最優策略,他 她都會按照最優...

Cogs 56 質數取石子 博弈

質數取石子 輸入檔案 stonegame.in 輸出檔案 stonegame.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 dd 和 mm 正在玩取石子遊戲。他們的遊戲規則是這樣的 桌上有若干石子,dd 先取,輪流取,每次必須取質數個。如果某一時刻某一方無法從桌上的石子中取...