POJ 3537 Crosses and Crosses [Multi-SG]

传送门


 

我也不知道为什么枚举vis必须加上一个边界才能A

以后还是都加上吧

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2005;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int n,m,f[N];
bool vis[N];
#define me(x) ( x<0 ? 0 : f[x] )
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        for(int j=1;j<=i;j++) vis[ me(j-3)^me(i-j-2) ]=1;
        for(int j=0;j<=i;j++) if(!vis[j]) {f[i]=j; break;}
        //printf("f %d %d\n",i,f[i]);
    }
    puts(f[n] ? "1" : "2");
}

 

posted @ 2017-03-16 23:35  Candy?  阅读(191)  评论(0编辑  收藏  举报