bzoj 1188: [HNOI2007]分裂遊戲
阿新 • • 發佈:2019-02-09
set sin accepted ring span cep color string 一場
SG定理
/************************************************************** Problem: 1188 User: lxy8584099 Language: C++ Result: Accepted Time:40 ms Memory:900 kb ****************************************************************/ /* 每個豆子都是單獨的一場遊戲 因為存在效仿性 即兩人可以走相同的方案 a[i]=a[i]&1 然後就是SG定理異或起來*/ #include<cstdio> #include<cstring> using namespace std; const int N=100,M=1e4+50; int T,n,a[N],SG[M],vis[M]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); SG[n]=0;// 最後一個點必輸for(int i=n-1;i>=1;i--) { memset(vis,0,sizeof(vis)); for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) vis[SG[j]^SG[k]]=1; for(int j=0;;j++) if(!vis[j]) {SG[i]=j;break;} } int ans=0; for(int i=1;i<=n;i++) if(a[i]&1) ans^=SG[i]; if(ans==0) puts("-1 -1 -1"),puts("0"); else { int tot=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) if((ans^SG[i]^SG[j]^SG[k])==0) { if(++tot==1) printf("%d %d %d\n",i-1,j-1,k-1); } printf("%d\n",tot); } } return 0; }
bzoj 1188: [HNOI2007]分裂遊戲