HDU 3404 Switch lights(NIM积)

题目链接

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

思路:Nim积模板题。

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 2000000
using namespace std;
int m[2][2]={0,0,0,1};
int Nim_Mult_Power(int x,int y){
    if(x<2)
        return m[x][y];
    int a=0;
    for(;;a++)
        if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
            break;
    int m=1<<(1<<a);
    int p=x/m,s=y/m,t=y%m;
    int d1=Nim_Mult_Power(p,s);
    int d2=Nim_Mult_Power(p,t);
    return (m*(d1^d2))^Nim_Mult_Power(m/2,d1);
}
int Nim_Mult(int x,int y){
    if(x<y)
        return Nim_Mult(y,x);
    if(x<2)
        return m[x][y];
    int a=0;
    for(;;a++)
        if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
            break;
    int m=1<<(1<<a);
    int p=x/m,q=x%m,s=y/m,t=y%m;
    int c1=Nim_Mult(p,s),c2=Nim_Mult(p,t)^Nim_Mult(q,s),c3=Nim_Mult(q,t);
    return (m*(c1^c2))^c3^Nim_Mult_Power(m/2,c1);
}
int main(){
    int t,n,x,y;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int ret=0;
        while(n--){
            scanf("%d%d",&x,&y);
            ret^=Nim_Mult(x,y);
        }
        if(ret)
            puts("Have a try, lxhgww.");
        else
            puts("Don't waste your time.");
    }
    return 0;
}

 

posted @ 2020-10-08 09:26  Ldler  Views(103)  Comments(0Edit  收藏  举报