hdu 3404 Switch lights 博弈论
主要是求NIM积!!!
代码如下:
#include<iostream> #include<cstdio> #include<stack> #include<cstring> #define ll __int64 using namespace std; int f[20][20]; int nim(int x,int y); int _nim(int x,int y){ if(!x||!y)return 1<<x+y; int &F=f[x][y]; if(F!=-1)return F; int ret=1,e=1; for(int i=0;i<16;++i) if(((x^y)>>i)&1)e*=1<<(1<<i); else if((x>>i)&1)ret=nim(ret,3*(1<<(1<<i))/2); return F=nim(ret,e); } int nim(int x,int y){ if(x<2||y<2)return x*y; int ret=0; for(int i=0;i<16;++i) if((x>>i)&1) for(int j=0;j<16;++j) if((y>>j)&1) ret^=_nim(i,j); return ret; } int main() { int t,x,y,n,res; memset(f,-1,sizeof(f)); scanf("%d",&t); while(t--){ scanf("%d",&n); res=0; while(n--){ scanf("%d%d",&x,&y); res^=nim(x,y); } if(res) puts("Have a try, lxhgww."); else puts("Don't waste your time."); } return 0; }