hdu 4664 Triangulation 博弈论

看到这题时,当时还不会做,也没搞懂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 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3253588.html