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

 

 

 

你可能感兴趣的:(HDU)