我也不知道为什么枚举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 ",i,f[i]); } puts(f[n] ? "1" : "2"); }