看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数……
现在在来做这题就很容易了,1A
打表容易发现在80左右的时候就出现循环节了
代码如下:
1 #include<stdio.h> 2 #include<cstring> 3 #define in(x) scanf("%d",&x) 4 int sg[101]; 5 bool vis[101]; 6 int getsg(int x) 7 { 8 if(sg[x]>=0) return sg[x]; 9 memset(vis,0,sizeof(vis)); 10 for(int i=0;i<=x-i-2;i++) 11 vis[getsg(i)^getsg(x-i-2)]=1; 12 int j=0; 13 while(vis[j]) j++; 14 return sg[x]=j; 15 } 16 int get(int i) 17 { 18 if(i>=100){ 19 i=i%34; 20 while(i+34<=100) i+=34; 21 } 22 return sg[i]; 23 } 24 int main(){ 25 int t,i,ans,j,n; 26 memset(sg,-1,sizeof(sg)); 27 sg[0]=0; 28 for(i=1;i<=100;i++){ 29 sg[i]=getsg(i); 30 } 31 in(t); 32 while(t--){ 33 in(n); 34 ans=0; 35 for(i=0;i<n;i++){ 36 in(j); 37 ans^=get(j); 38 } 39 puts(ans==0?"Dave":"Carol"); 40 } 41 return 0; 42 }