1. 程式人生 > >POJ2975 Nim 博弈論 尼姆博弈

POJ2975 Nim 博弈論 尼姆博弈

gif pen 分享圖片 can play include -c org one

http://poj.org/problem?id=2975

題目始終是ac的最大阻礙。

問只取一堆有多少方案可以使當前局面為先手必敗。

顯然由尼姆博弈的性質可以知道需要取石子使所有堆石子數異或和為0,那麽將某一堆a個石子變為a^異或和即可。

a1^a2^a3^...^an=y;

a1^a2^a3^...^an^y=0;

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<map>
 7
using namespace std; 8 int m; 9 int a[1010]={}; 10 int main(){ 11 while(~scanf("%d",&m)){ 12 if(m==0)break; 13 int x,z=0,y=0; 14 for(int i=1;i<=m;i++){ 15 scanf("%d",&x); 16 y^=x; 17 a[i]=x; 18 } 19 if(y){ 20 for
(int i=1;i<=m;i++){ 21 if((y^a[i])<a[i]){ 22 z++; 23 } 24 } 25 printf("%d\n",z); 26 } 27 else{ 28 printf("%d\n",0); 29 } 30 } 31 return 0; 32 }
View Code

POJ2975 Nim 博弈論 尼姆博弈