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;

}
View Code

 

 

你可能感兴趣的:(switch)