传送门
每一次我们爆求sg函数,然后求出全局sg函数
然后我们爆枚从那个堆里取几个就可以了
时间复杂度O((N+max(Ai))*M)
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[15],b[15],sg[1005],T[1005];
int n,m,mx,ans;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
mx=max(mx,a[i]);
}
scanf("%d",&m);
for (int i=1;i<=m;i++)
scanf("%d",&b[i]);
for (int i=1;i<=mx;i++){
memset(T,0,sizeof(T));
for (int j=1;j<=m;j++)
if (i>=b[j]) T[sg[i-b[j]]]=1;
for (sg[i]=0;;sg[i]++)
if (!T[sg[i]]) break;
}
for (int i=1;i<=n;i++)
ans^=sg[a[i]];
if (!ans){
puts("NO");
return 0;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i]>=b[j])
if ((ans^sg[a[i]-b[j]]^sg[a[i]])==0){
puts("YES");
printf("%d %d",i,b[j]);
return 0;
}
}