Day2
博弈论。
先求出一堆石子有x个的时候,sg值是多少:即他所有后继状态的mex值。
每一堆的sg值异或起来等于0就先手必败。
输出方案:当先手取走后,轮到后手来取,那么必须达到“先手”必败,原本的先手才能必胜。
所以异或值为0,即要让此堆剩下的与别的堆sg值相同。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> using namespace std; int n,m,sg[1005],a[15],b[15],v[15],ans; void Getsg() { for (int i=1;i<=1000;i++) { memset(v,0,sizeof(v)); for (int j=1;j<=m;j++) if (i-b[j]>=0) v[sg[i-b[j]]]=1; for (int j=0;j<=10;j++) if (!v[j]) { sg[i]=j; break; } } } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for (int i=1;i<=m;i++) scanf("%d",&b[i]); Getsg(); int ans=0; for (int i=1;i<=n;i++) ans^=sg[a[i]]; if (!ans) { printf("NO\n"); return 0; } printf("YES\n"); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (sg[a[i]-b[j]]==(ans^sg[a[i]])) { printf("%d %d\n",i,b[j]); return 0; } return 0; }
感悟:
wa是因为输出格式。。(YES写成Yes..)