Cogs 56 質數取石子 博弈

2021-07-28 18:54:32 字數 1691 閱讀 1154

質數取石子

★★ 輸入檔案:stonegame.in 輸出檔案:stonegame.out 簡單對比

時間限制:1 s 記憶體限制:128 mb

問題描述

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

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

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

輸入格式

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

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

輸出格式

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

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

樣例輸入

3 8

9 16

樣例輸出

1 -1

3 樣例說明

當桌上有 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。

/*

比較簡單.

但是沒有1a qwq.

一開始把a的決策搞成max了.

求個sg函式,判一判必勝必敗態就好.

*/#include

#include

#define maxn 20001

using

namespace

std;

int n,sg[maxn],pri[maxn],tot;

bool b[maxn],f[maxn];

void pre()

int x=1;

for(int i=2;i<=maxn-1;i++)

if(x==tot+1) break;

}}void check(int x)

if(!flag)

}else

}f[x]=flag;

sg[x]=max1+1;

}void slove()

int main()

return

0;}

質數取石子

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

質數取石子

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

博弈取石子

有一堆石子,a,b兩人輪流從中取出石子,每次取出的石子數目只能為1,3,7或8,最後一枚石子誰取到就是輸方。a,b兩人都足夠聰明,不會做出錯誤的判斷。現給出一定數目的石子,a先取石子,計算a最終是輸是贏,贏用1表示,輸用0表示.輸入描述 第一行為乙個整數n 0 n 100 表示玩n局,接下來n行每行...