设为首页 加入收藏

TOP

HDU 3032 Nim or not Nim?(sg函数博弈)
2015-07-20 17:40:34 来源: 作者: 【 】 浏览:2
Tags:HDU 3032 Nim not 函数 博弈

题目地址:HDU 3032

这题是很好用来练习sg函数打表的一题。

下面是sg函数值打表代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
           #include 
           
             #include 
            
              using namespace std; #define LL long long int sg[110000];//sg函数值打表代码 int getsg(int x) { int ans, i; int mex[11000]; memset(mex,0,sizeof(mex)); for(i=x-1; i>=0; i--)//当选择拿出石子时的sg后继标记 { mex[sg[i]]=1; } for(i=1; i<=x/2; i++)//当选择分成两堆时的sg后继标记 { ans=0; ans^=sg[i]; ans^=sg[x-i]; mex[ans]=1; } for(i=0;; i++)//最小的非sg后继数 { if(!mex[i]) { sg[x]=i; return sg[x]; } } } int main() { int t, n, x, sum, i; sg[0]=0; for(i=0; i<100; i++) { getsg(i); printf("sg[%d]->%d\n",i,sg[i]); } return 0; }
            
           
         
        
       
      
     
    
   
  

由输出结果可以看出来

sg[4k]=4k-1

sg[4k+1]=4k+1;

sg[4k+2]=4k+2;

sg[4k+3]=4k+4;

所以可以直接根据这个规律来判断所有情况下的sg值了。然后从头到尾异或过去就可以解出来了。

代码如下:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
           #include 
           
             #include 
            
              using namespace std; #define LL long long int main() { int t, n, x, sum, i; scanf("%d",&t); while(t--) { scanf("%d",&n); sum=0; for(i=0;i
             
              

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Powershell管理SharePoint站点 下一篇hdu5014 Number Sequence(异或运..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·python数据分析岗的 (2025-12-25 10:02:21)
·python做数据分析需 (2025-12-25 10:02:19)
·成为一个优秀的pytho (2025-12-25 10:02:16)
·Java后端面试实习自 (2025-12-25 09:24:21)
·Java LTS版本有哪些 (2025-12-25 09:24:18)