标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 79 Accepted Submission(s): 48
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int sg[10005]= {0}; bool vis[10005]; int t,cas=1; void get() { memset(sg,0,sizeof(sg)); sg[0]=0; for(int i=1; i<=200; i++) { memset(vis,0,sizeof(vis)); for(int j=1;j<=i;j++) { for(int k=1;j+k<=i;k++) { if(j!=0&&k!=0&&((i-j-k)!=0)) vis[sg[j]^sg[k]^sg[i-j-k]]=1;//操作1 } } for(int j=0;j<i;j++)//操作2 vis[sg[j]]=1; for(int x=0; ; x++) if(!vis[x]) { sg[i]=x; break; } } } int main() { get(); for(int i=1;i<=100;i++) printf("i: %d %d\n",i,sg[i]); return 0; }
运行该代码,我们会得到如下结果:
注意在这个表当中
观察结果我们可以得知,当n为8的倍数时,sg(n)=n+1; 当(n+1)为8的倍数时,sg(n)=n-1; 否则sg(n)=n;
所以我们把sg值异或起来就能判断出谁赢了。
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { int n; long long x,ans=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lld",&x); if(x%8==0) ans=ans^(x-1); else if((x+1)%8==0) ans=ans^(x+1); else ans=ans^x; } if(ans) puts("First player wins."); else puts("Second player wins."); } return 0; }
HDU 5795 A Simple Nim (博弈) ---2016杭电多校联合第六场
标签:
原文地址:http://www.cnblogs.com/Ritchie/p/5737929.html