HDU 3404 Switch lights(NIM积)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3404

题意:一个n*m的格子里全是灯。每次选出一个矩形,改变四个角灯的状态,而且右下角的灯初始必须是开的。

思路:NIM积模板。没明白怎么推导的式子。





const int INF=2000000000;

const int N=505;

int map[2][2]={0,0,0,1},n;



int cal(int x)

{

    return 1<<(1<<x);

}



int nim_multi_power(int x,int y)

{

    if(x<2) return map[x][y];

    int p,q,s,t,i,d1,d2,M;

    for(i=0;;i++) if(x>=cal(i)&&x<cal(i+1)) break;

    M=cal(i);

    p=x/M; q=x%M;

    s=y/M; t=y%M;

    d1=nim_multi_power(p,s);

    d2=nim_multi_power(p,t);

    return (M*(d1^d2))^nim_multi_power(M/2,d1);

}



int nim_multi(int x,int y)

{

    if(x<y) return nim_multi(y,x);

    if(x<2) return map[x][y];

    int p,q,s,t,M,c1,c2,c3,i;

    for(i=0;;i++) if(x>=cal(i)&&x<cal(i+1)) break;

    M=cal(i);

    p=x/M; q=x%M;

    s=y/M; t=y%M;

    c1=nim_multi(p,s);

    c2=nim_multi(p,t)^nim_multi(q,s);

    c3=nim_multi(q,t);

    return (M*(c1^c2))^c3^nim_multi_power(M/2,c1);

}



int C;



int main()

{

    RD(C);

    while(C--)

    {

        RD(n);

        int x,y,ans=0;

        while(n--)

        {

            RD(x,y);

            ans^=nim_multi(x,y);

        }

        if(ans) puts("Have a try, lxhgww.");

        else puts("Don't waste your time.");

    }

    return 0;

}

  

你可能感兴趣的:(switch)