码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2176 取(m堆)石子游戏 (裸Nim)

时间:2014-10-01 22:35:21      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   div   c   log   代码   amp   

题意:

m堆石头,每堆石头个数:a[1]....a[m]。

每次只能在一堆里取,至少取一个。

最后没石子取者负。

先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法。如果从有a个石子的堆中取若干个后剩下b个后会胜就输出a b

 

思路:

裸的NIM。

单看一堆石子,没有石头sg[0]=0,一个石头sg[1]=1,....n个石头sg[n]=n。

故SG[a[1],a[2]...a[m]] = sg[a[1]]^...^sg[a[m]] = a[1]^...^a[m]

SG=0 为先手必败点。

 

代码:

///Nim游戏

int m,ans;
int a[200005];

int main(){
    while(scanf("%d",&m),m){
        scanf("%d",&a[1]);
        ans=a[1];
        rep(i,2,m){
            scanf("%d",&a[i]);
            ans=ans^a[i];
        }
        if(!ans)
            puts("No");
        else{
            puts("Yes");
            rep(i,1,m){
                if((ans^a[i])<=a[i]){
                    printf("%d %d\n",a[i],ans^a[i]);
                }
            }
        }
    }
}

 

hdu 2176 取(m堆)石子游戏 (裸Nim)

标签:style   blog   color   sp   div   c   log   代码   amp   

原文地址:http://www.cnblogs.com/fish7/p/4003573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!