题目链接:bzoj 3576
这道题的暴力应该都会,但是对于这道题只能的70分,然后优化就看了很多神犇的题解(具体什么的大家就自己脑补吧= =),膜拜了一下标程。。。Orz。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn (100000+10)
int T,F,N;
int sg[maxn];
int get(int x){
if(sg[x]!=-1)return sg[x];
if(x<F)return sg[x]=0;
bool vis[maxn];
memset(vis,0,sizeof(vis));
for(int i=2;i<=x;i=x/(x/i)+1){
for(int j=i;j<=i+1&&j<=x;j++){
int temp=0;
if((x%j)&1)temp^=get(x/j+1);
if((j-x%j)&1)temp^=get(x/j);
vis[temp]=1;
}
}
for(int i=0;;i++)
if(!vis[i])return sg[x]=i;
}
int main(){
scanf("%d%d",&T,&F);
memset(sg,-1,sizeof(sg));
while(T--){
scanf("%d",&N);
int ans=0;
while(N--){
int x; scanf("%d",&x);
ans^=get(x);
}
if(ans)printf("1");
else printf("0");
if(T)printf(" ");
}
return 0;
}