60pts
#include<bits/stdc++.h>
using namespace std;
int SG[500005],t,F;
bool f[5005];\\注意这里
int sg(int n){
if(SG[n]>-1) return SG[n];
if(n<F) return (SG[n]=0);
SG[n]=0;
int l;
memset(f,0,sizeof f);
for(l=2;l<=n;l=n/(n/l)+1){
for(int i=l;i<=min(l+1,n);i++){
int res=0;
if((n%i)&1) res^=sg(n/i+1);
if((i-n%i)&1) res^=sg(n/i);
f[res]=1;
}
}
for(int i=0;;i++)
if(!f[i]){
SG[n]=i;
return i;
}
}
int main(){
for(int i=0;i<=500000;i++)SG[i]=-1;
cin>>t>>F;
while(t--){
int n,x,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
ans^=sg(x);
}
if(ans>0) cout<<1<<' ';
else cout<<0<<' ';
}
}
100pts
#include<bits/stdc++.h>
using namespace std;
int SG[500005],t,F;
int sg(int n){
if(SG[n]>-1) return SG[n];
if(n<F) return (SG[n]=0);
SG[n]=0;
int l;
bool f[5005];\\注意这里
memset(f,0,sizeof f);
for(l=2;l<=n;l=n/(n/l)+1){
for(int i=l;i<=min(l+1,n);i++){
int res=0;
if((n%i)&1) res^=sg(n/i+1);
if((i-n%i)&1) res^=sg(n/i);
f[res]=1;
}
}
for(int i=0;;i++)
if(!f[i]){
SG[n]=i;
return i;
}
}
int main(){
for(int i=0;i<=500000;i++)SG[i]=-1;
cin>>t>>F;
while(t--){
int n,x,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
ans^=sg(x);
}
if(ans>0) cout<<1<<' ';
else cout<<0<<' ';
}
}
感觉没区别