주제 :
사실, 추가 NIM 게임의 기본은 기회를 잡을 수 없습니다.
다중 스택 돌의 복수 그들이 SG 1 상부 손 승리하면 최대 인 게임 전체의 배타적 OR 값 SG의 SG 값의 출발점, 게임으로 볼 0 플립 승리 할 수있다.
: 키는 어떻게 수요 SG 값입니다 > 게임 상황이 수 - 당신이 법을 찾기 위해 테이블을 재생할 수 있습니다 심지어 측 동적 DFS를 , 그리고 다시 SG 값 DFS 요청 (MEX를 찾고 값을)
상세 사항 : 는 DFS는 갈 수 작은 범위 (가장자리가 너무 많이 있기 때문에, 가능한 도달) 최대 20, 그래서 죽음의주기, 또한 숫자가 너무 큰 돌 수 있습니다 때 자신의 잘못을 의심하지 않는다 .
법 : 돌 수가 홀수 MEX 값이 [I] +1, 짝수, MEX 값 인 [I] -1.
테이블 코드를 재생 :
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; #DEFINE N 25 #DEFINE M 100005 INT 통 [분] [N], MEXX [M], 헤드 [M], [M], NEX [M], TOT = 행 0 , 발 [M] ndnum, FL [ 엠]; 보이드 추가 ( int로 하는 INT의 [++ TOT] = B와 b) {; NEX [TOT] = 헤드 [A]; 헤드 [A] = TOT 단계; } 공극 DFS는 ( int로 U)를 { 경우 (발 [유] == 0 ) 창 ; 경우 (FL [U] == 0 ) { 브로 [ ++ ndnum = 브로 [U]; 추가 (U, ndnum); FL [ndnum] = 1; DFS (ndnum); } 에 대해 ( int로 I = 0 ; I <= 브로 [U] - 1 ; 내가 ++ ) { 브로 [ ++ ndnum = I; 추가 (U, ndnum); FL [ndnum] = FL [U]; DFS (ndnum); } } 공극 SG ( INT U) { 경우 (발 [유] == 0 ) {MEXX [U] = 0 ; 반환 ; } 에 대해 ( int로 I = 헤드를 [U] I, I = NEX [I]) { INT의 V = 내지 [I]; SG (V); 통 [U] MEXX [V] = 참 ; } 에 대해 ( int로 I = 0 ; I <가가 = 20 ; 내가 ++ ) 경우 (! 통 [U] [I]) {MEXX [U] = 1; 반환 ; } } INT 의 main () { 위해 ( int로 I = 1 ; i가 <= 10 ; I ++ ) { INT의 ID = ++ ndnum; 발 [ID] = 1; FL [이드] = 0 ; DFS (ID); SG (ID); 의 printf ( " MEX % D % D \ n " , I, MEXX [ID]); } }
법의 코드를 찾기 위해 테이블을 히트 :
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; #DEFINE 줄게 긴 긴 INT 의 main () { freopen을 ( " nim.in " , " R " , 표준 입력); freopen을 ( " nim.out " , " w " , 표준 출력); INT T, N하는; scanf와 ( " %의 D ' , T); 반면 (T-- ) { 는 scanf ( " %의 D ' , N); 는 scanf ( "" , & A ) 경우 (a & 1 )를 ++, 다른 장음을 , LL ANS = A는; 위해 ( int로 I = 2 ; 나는 <= N; I ++는 ) { 는 scanf ( " %의 D를 " A, & ) 경우 (a & 1 )를 ++ , 다른 장음 , ANS ^ = a 및 } 경우 (ANS)의 printf ( " \ A 않음 " ), 다른 원인 의 printf ( "B \ 없음 " ); } } / * 2 2 1 2 2 2 2 * /