HDU1847Good Luck in CET4 Everybody!(巴什博弈入门)

先不说1847这道题,我们先从巴什博弈入手,理解了巴什博弈,相信这道题便迎刃瓦解。

巴什博弈(定理献上):

              只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m.最后取光者得胜.

       n = (m+1)r+s , (r为任意自然数,sm), n%(m+1) != 0, 则先取者肯定获胜。

巴什博弈还是很好理解滴,以你是先手的角度考虑。你想把对手给弄垮,那么每一局,你都必须构建一个局势,这个局势就是每次都留给对手m+1的倍数个物品(为什么留给m+1倍就一定能赢,你稍微动动脑子就出来了)。所以不只是取物品中的博弈可以用到巴什定理,还可以是报数之类的,看谁先报到100.并且每次报的数必须是1~10(包括1跟10),那么你每次都应该留给对手剩下的报数个数为11的倍数。


当当,转到此题来。题目为:

1、  总共n张牌; 
2、  双方轮流抓牌; 
3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…) 
4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;

如果你是先手,那么请考虑你的必胜点。由于规定只能去2的幂次,那么只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1,要么取剩下1,给你胜利  2,要么对手取了一点点儿,轮到你时,你就又可以构造一个3的倍数了嘛。   所以无论哪种情况,当你留给对手为3N的时候,你是必胜的。好吧,题目说你就是Kiki,那么当牌数为3的倍数时,Kiki就输了。因为一出来,上帝就留给了Kiki一个3的倍数。没办法,但是如果一开始上帝留给Kiki的不是3的倍数,那么Kiki肯定能够用先手的优势构造出3的倍数,那么Kiki就必胜。所以代码是异常的简单啊。

码出代码为:

#include<iostream> 
using namespace std; 
int main(void

    int n; 
    while(scanf("%d",&n)==1
    { 
        if(n%3==0
            cout<<"Cici"<<endl; 
        else 
            cout<<"Kiki"<<endl; 
    } 
    return 0



原文地址:https://www.cnblogs.com/cchun/p/2520096.html