JZOJ5085 遊戲 JZOJ3996 下棋

2021-07-31 02:55:03 字數 1301 閱讀 2540

給定一張

n 個點

m條邊的有向無環圖,每條邊有顏色ci

。圖上有

q 顆石子,每顆石子一開始在乙個點上。

兩個人輪流在圖上進行操作。每次操作時,選擇乙個有出邊(「下棋」一題沒有這個限制)且點上有石子的點

x,從點上取走乙個石子,然後選擇乙個顏色集合

s (可以為空),如果

x的某條出邊的顏色屬於該集合,則在該邊的終點上放上一顆石子。不能操作者輸。

請問先手是否存在必勝策略。n≤

200,m≤

5000,q

≤105,

ci≤5000

可以發現每個石子其實看成乙個單獨的遊戲。

考慮如何計算乙個石子的sg

函式值。 sg

(x)=

mexs

⊆s這個怎麼算呢?我們把同顏色的邊先異或起來,然後對這些數求線性基,假設

i 是最小的線性相關的位(線性基該位為

0),那麼答案顯然就是2i

。 然後就可以用bitset瞎壓一下位來做了。

注意,如果必須選擇有出邊的點的話,乙個沒有出邊的點sg

值應該是

0 ,如果沒有這個限制就是1。

#include 

#include

#include

#include

using

namespace

std;

int read()

const

int n=205;

const

int m=5005;

const

int c=5005;

typedef

bitset

b;b base[n],sg[n],cbit[c],ans;

int nxt[m],tov[m],col[m];

bool vis[n];

int last[n];

int used[c];

int ext[c];

int n,m,tot,q;

void insert(int x,int y,int z)

void dfs(int x)

for (int i=0;i<=n;i++) base[i].reset();

for (int i=1;i<=ext[0];++i)

}for (int i=0;i<=n;++i)

if (base[i].none())

}int main()

JZOJ 規律 遊戲

有一堆金塊,king和貓老大輪流抽金塊,每次抽的個數必然是2的次方冪,求勝利 抽走最後一塊 的是誰 三行每行乙個數 n 0對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一次拿的最小數量。8 42maolaoda ...

jzoj遊戲 規律 數論

description king 很喜歡賭博,這次 king邀請貓老大來玩乙個遊戲。king 拿出了 n 塊 0 input 三行每行乙個數 n 0 output 對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一...

JZOJ 數字遊戲 DP

小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi,即a1減掉b1,a2減掉b2,如此重複m個回合,所有你擦去的數字之和就是你所得的分數。小w和他的好朋友小y玩了這個遊戲,可是他發...